Semaphore.WaitOne / Release vs Monitor.Pulse / Wait

时间:2010-08-23 11:21:31

标签: .net multithreading

对我而言,功能Semaphore.WaitOne/Release似乎等于Monitor.Wait/Pulse。跳过进程间功能,速度(是的,Monitor是管理的)其他非功能差异,那么真正的区别是什么呢?

2 个答案:

答案 0 :(得分:10)

Semaphore的主要目的是控制对有限资源集的访问。线程可以通过调用WaitOneRelease参与资源获取。一个thead应该调用WaitOne来获取资源。但是,只有当信号量的计数达到0时才会阻塞,否则线程可以立即自由获取。一旦该线程完成,它应该调用Release以通知信号量已经为另一个线程释放了一个额外的插槽。

Monitor.WaitMonitor.Pulse完全不同。首先,不涉及计算。如果在没有调用Pulse的情况下调用Wait,则忽略并丢弃该信号。它没有像信号量那样排队。事实上,WaitPulse的行为根本没有内在意义。 Wait只是等待获取锁定状态的更改(从Monitor.Enter获取)。 Pulse是发生变化的信号。这就是您经常在Wait循环中看到while的原因。等待线程必须重新测试等待条件,因为它不知道改变了什么!

Monitor.WaitMonitor.Pulse是基本同步机制,可用于形成几乎任何其他同步设备,包括信号量。

答案 1 :(得分:2)

Monitor.Wait / Pulse为您提供了一个条件变量,它更像是一个自动重置事件而不是一个信号量(但不完全是)。主要区别在于信号量有一个计数,这意味着您不需要锁定任何东西以确保不会错过脉冲(与Monitor.Wait不同)。