c#多线程同步之EventWaitHandle使用

本文详细介绍了C#中的EventWaitHandle类及其派生类AutoResetEvent和ManualResetEvent,讨论了其线程同步方法,如SignalAndWait、WaitAll和WaitAny。与Mutex不同,EventWaitHandle具有线程无关性,适合用于线程间的通信和同步。文章通过示例解释了如何使用EventWaitHandle实现生产者和消费者场景,并对比了Mutex和EventWaitHandle在同步和通信上的差异。
摘要由CSDN通过智能技术生成

文章原始出处 http://xxinside.blogbus.com/logs/47523285.html

预备知识:C#线程同步(1)- 临界区&Lock,C#线程同步(2)- 临界区&Monitor,C#线程同步(3)- 互斥量 Mutex

WaitHandle一家

  在前一篇我们已经提到过Mutex和本篇的主角们直接或间接继承自WaitHandle:

Mutex类,这个我们在上一篇已经讲过。
EventWaitHandle 类及其派生类AutoResetEvent 和 ManualResetEvent,这是本篇的主角。
Semaphore 类,即信号量,我们下一篇再讲。
  WaitHandle提供了若干用于同步的方法。上一篇关于Mutex的blog中已经讲到一个WaitOne(),这是一个实例方法。除此之外,WaitHandle另有3个用于同步的静态方法:

SignalAndWait(WaitHandle, WaitHandle):以原子操作的形式,向第一个WaitHandle发出信号并等待第二个。即唤醒阻塞在第一个WaitHandle上的线程/进程,然后自己等待第二个WaitHandle,且这两个动作是原子性的。跟WaitOne()一样,这个方法另有两个重载方法,分别用Int32或者TimeSpan来定义等待超时时间,以及是否从上下文的同步域中退出。
WaitAll(WaitHandle[]):这是用于等待WaitHandle数组里的所有成员。如果一项工作,需要等待前面所有人完成才能继续,那么这个方法就是一个很好的选择。仍然有两个用于控制等待超时的重载方法,请自行参阅。
WaitAny(WaitHandle[]):与WaitAll()不同,WaitAny只要等到数组中一个成员收到信号就会返回。如果一项工作,你只要等最快做完的那个完成就可以开始,那么WaitAny()就是你所需要的。它同样有两个用于控制等待超时的重载。
线程相关性(Thread Affinity )

  EventWaitHandle和Mutex两者虽然是派生自同一父类,但有着完全不同的线程相关性:

Mutex与Monitor一样,是“线程相关(Thread Affinity)”的。我们之前已经提到过,只有通过Monitor.Enter()/TryEnter()获得对象锁的线程才能调用Pulse()/Wait()/Exit()&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值