在我的代码中,如果我的线程在调用.ReleaseMutex()之前调用.WaitOne()不止一次会很方便。
反之亦然:在重新启动一个以调用.WaitOne()开头的循环之前,先调用.ReleaseMutex()几次。
某些操作系统/编译器组合允许这样做。有些人没有。
答案 0 :(得分:2)
互斥锁只有2种状态:锁定或解锁。它无法锁定两次或解锁两次。你想要的东西是信号量:See Here。信号量有计数器,每个WaitOne
计数器减1后,Release
计数器每次调用后增加1。
答案 1 :(得分:0)
.NET System.Threading.Mutex
类使用可重入的Win32内核互斥对象。来自the documentation的以下注释说明了正确用法:
拥有互斥锁的线程可以在重复调用
WaitOne
时请求相同的互斥锁,而不会阻止其执行。但是,线程必须多次调用ReleaseMutex
方法才能释放互斥锁的所有权。
然后很明显,操作系统正在计算进入互斥锁的次数-它不是“已锁定或已解锁”的二进制状态(除了计数之外,还有“已放弃”的其他状态)。