线程同步之等待句柄

来源:互联网 发布:银行软件开发笔试 编辑:程序博客网 时间:2024/05/16 12:57
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();}

原创粉丝点击