假设我需要在.Net 3.5 SP1中编排同步算法,并且在标题中列出的任何同步原语都非常适合此任务。
从性能角度来看,这些同步原语中有哪个更加高效?
我问这个问题是因为我已经编码了一段时间,但对这个主题没有正确的知识。
注: - ".Net"不翻译; - "synchronization algorithm"可视具体情境酌情翻译; - "synchronization primitives"指同步原语或同步基元,可统一翻译。
假设我需要在.Net 3.5 SP1中编排同步算法,并且在标题中列出的任何同步原语都非常适合此任务。
从性能角度来看,这些同步原语中有哪个更加高效?
我问这个问题是因为我已经编码了一段时间,但对这个主题没有正确的知识。
WaitHandles看起来与Wait/Pulse构造非常相似,但区别在于细节:WaitHandles的Set方法会在没有线程等待时设置信号。这意味着如果您在一个线程中调用Set,然后在同一waithandle上的另一个线程中调用WaitOne,第二个线程将继续执行。而Wait和Pulse是不同的,Pulse只会向已经在等待队列中的线程发送信号。这意味着如果您在一个线程中调用了Pulse,然后在同一对象的另一个线程中调用Wait,第二个线程将永远等待(死锁)。使用Wait和Pulse需要非常小心,只有当您知道自己在做什么时才使用,否则可能只是走运...
要使用Monitor创建类似WaitHandle的行为,无论是AutoReset还是ManualReset,都要比简单的Wait/Pulse构造复杂得多。只需使用您需要的工具完成工作即可:
如果无法使用简单的锁定或原子操作来同步线程,请考虑使用WaitHandles。如果无法使用WaitHandles同步线程,请考虑使用Wait和Pulse。
Wait
/Pulse
很容易导致死锁。即使是Monitor.Pulse
方法的MSDN示例也存在竞争条件。如果在他们的示例中第二个线程在第一个线程之前启动,它将会死锁。 - vgru如果您遵循一些简单的规则,等待和脉冲是没有问题的: