对我而言,功能Semaphore.WaitOne/Release
似乎等于Monitor.Wait/Pulse
。跳过进程间功能,速度(是的,Monitor是管理的)其他非功能差异,那么真正的区别是什么呢?
答案 0 :(得分:10)
Semaphore
的主要目的是控制对有限资源集的访问。线程可以通过调用WaitOne
和Release
参与资源获取。一个thead应该调用WaitOne
来获取资源。但是,只有当信号量的计数达到0时才会阻塞,否则线程可以立即自由获取。一旦该线程完成,它应该调用Release
以通知信号量已经为另一个线程释放了一个额外的插槽。
Monitor.Wait
和Monitor.Pulse
完全不同。首先,不涉及计算。如果在没有调用Pulse
的情况下调用Wait
,则忽略并丢弃该信号。它没有像信号量那样排队。事实上,Wait
和Pulse
的行为根本没有内在意义。 Wait
只是等待获取锁定状态的更改(从Monitor.Enter
获取)。 Pulse
是发生变化的信号。这就是您经常在Wait
循环中看到while
的原因。等待线程必须重新测试等待条件,因为它不知道改变了什么!
Monitor.Wait
和Monitor.Pulse
是基本同步机制,可用于形成几乎任何其他同步设备,包括信号量。
答案 1 :(得分:2)
Monitor.Wait / Pulse为您提供了一个条件变量,它更像是一个自动重置事件而不是一个信号量(但不完全是)。主要区别在于信号量有一个计数,这意味着您不需要锁定任何东西以确保不会错过脉冲(与Monitor.Wait不同)。