对我来说,现在看起来在功能上Semaphore.WaitOne/Release
等同于Monitor.Wait/Pulse
。跳过进程间的能力,速度(是的,监视器是托管的)其他非功能差异,那么真正的差异是什么?
发布于 2010-08-23 23:53:20
Semaphore
的主要目的是控制对有限资源集的访问。线程可以通过调用WaitOne
和Release
参与资源获取。thead应该调用WaitOne
来获取资源。但是,只有当信号量的计数达到0时,它才会阻塞,否则线程可以立即自由获取。一旦该线程完成,它就应该调用Release
向信号量发出信号,表明已为另一个线程释放了额外的插槽。
Monitor.Wait
和Monitor.Pulse
是截然不同的。首先,也是最重要的,没有涉及到计数。如果在没有调用Wait
的情况下调用Pulse
,则忽略并丢弃该信号。它的排队方式与信号量不同。事实上,Wait
和Pulse
的行为根本没有任何固有的含义。Wait
只是在等待获取的锁(从Monitor.Enter
获取)的状态发生变化。Pulse
是发生变化的信号。这就是为什么您经常看到在while
循环中调用Wait
的原因。等待线程必须重新测试等待条件,因为它不知道发生了什么变化!
Monitor.Wait
和Monitor.Pulse
是基本的同步机制,可用于形成几乎任何其他同步设备,包括信号量。
发布于 2010-08-23 19:38:59
with /Pulse为您提供了一个条件变量,它更像是一个自动重置事件,而不是一个信号量(但不完全是)。主要区别在于信号量有计数,这意味着您不需要锁定任何东西来确保不会错过一个脉冲(与Monitor.Wait不同)。
https://stackoverflow.com/questions/3547030
复制相似问题