线程同步之等待句柄

1、WaitHandle类是个抽象类,有方法:WaitOne()、WaitAll()、WaitAny(), 功能实现由其子类完成。

2、互斥同步对象Mutex,派生自WaitHandle类,有两个状态:onwed、unowned。

private Mutex m = new Mutex();
public void DoSomething()
{
    m.WaitOne();
    //....
    m.ReleaseMutex();
}

3、Semaphore类 管理多个共享资源(派生自WaitHandle类
Semaphore可以同步多个线程对同一种类型多个共享资源访问。如果系统中拥有多中不同类型的资源,则可以创建多个Semaphore对象。
Mutex类是Semaphore的特殊情况,即资源数为1。

Semaphore类的构造函数:
public Semaphore (int initialCount, int maximumCount)

initialCount    表示目前剩余资源数
maximumCount     表示总资源数

示例:
private const int ComputerNum = 3;
private Semaphore sp = new Semaphore(ComputerNum , ComputerNum);

public void DoSomeThing()
{
    sp.WaitOne();               //资源数自动减一
    //.....
    sp.Release();                //资源数自动加一
}
多个线程同时执行,只要可用资源数>0

4、EventWaitHandle类,等待时间的发生
(1)ManualResetEvent类, xx.Set()时,允许一批线程运行。
(2)AutoResetEvent类,  xx.Reset()时,允许线程阻塞队列里的一个线程运行。

示例1:
private static ManualResetEvent mre = new ManualResetEvent(false);   //初始为“红灯”
private static void ThreadProc()
{
    string name = Thread.CurrentThread.Name;
 
    Console.WriteLine(name + " starts and calls mre.WaitOne()");
 
    mre.WaitOne();
 
    Console.WriteLine(name + " ends.");
}
 
private static void Go()
{
    mre.Set();
}
 
private static void Stop()
{
    mre.Reset();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值