.net - AutoResetEvent、ManualResetEvent 与监视器

标签 .net concurrency synchronization .net-3.5

假设我必须在 .Net 3.5 SP1 中编排同步算法,标题中列出的任何同步原语都非常适合该任务。

从性能的角度来看,是否有任何一个比其他的性能更好?

我问这个是因为我已经编码了一段时间,但对这个主题没有适当的了解。

最佳答案

WaitHandles 看起来与Wait/Pulse Constructs 非常相似,但区别在于细节:WaitHandles Set 方法即使没有线程在等待也设置信号。这意味着如果您在一个线程中调用 Set ,然后在同一等待句柄上的另一个线程中调用 WaitOne ,则第二个线程将继续。 Wait 和 Pulse 不同,Pulse 只向已经在等待队列中的线程发出信号。这意味着如果您在一个线程中调用 Pulse,然后在同一对象的另一个线程中调用 Wait,则第二个线程将永远等待(死锁)。如果使用等待和脉冲,您必须非常小心,仅当您知道自己在做什么时才使用它,否则您可能会很幸运 ...

要使用 Monitor、天气 AutoReset 或 ManualReset 自己创建 WaitHandle 的行为,您需要做的不仅仅是简单的 Wait/Pulse 构造。 只需使用完成工作所需的工具 :

如果您无法使用简单的锁定或原子操作同步线程,请考虑使用 WaitHandles。如果您无法使用 WaitHandles 同步线程,请考虑使用 Wait 和 Pulse。

关于.net - AutoResetEvent、ManualResetEvent 与监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1717194/

相关文章:

java - BoundedSemaphore 信号量与标准互斥量

java - 非同步静态方法和线程安全

c# - servicestack.text 将数组反序列化为对象

c# - 如何以编程方式访问垃圾收集器的性能计数器?

.net - Microsoft Dynamics AX - 新开发人员资源

wcf - 无法使对 WCF Web 服务的并发调用正常工作

c# - 解密AES密文

mysql:像 SQS 一样的排他性选择?

java - 现代 JVM 中的双重检查锁定

android - NDK分辨率结果:项目设置:Gradle模型版本= 5.4.1,NDK版本为UNKNOWN错误