And*_*rey 6 .net multithreading
对我来说,它看起来在功能Semaphore.WaitOne/Release上等于Monitor.Wait/Pulse.跳过进程间功能,速度(是的,监控是否管理)其他非功能差异,那么真正的区别是什么呢?
Bri*_*eon 10
a的主要目的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是可以用于形成几乎包括信号量的任何其他同步装置基本同步机制.