一个线程可以在调用.ReleaseMutex()之前不止一次调用Mutex的.WaitOne(),反之亦然?

时间:2018-05-15 22:19:45

标签: c# mutex recursive-mutex

在我的代码中,如果我的线程在调用.ReleaseMutex()之前调用.WaitOne()不止一次会很方便。

反之亦然:在重新启动一个以调用.WaitOne()开头的循环之前,先调用.ReleaseMutex()几次。

某些操作系统/编译器组合允许这样做。有些人没有。

2 个答案:

答案 0 :(得分:2)

互斥锁只有2种状态:锁定或解锁。它无法锁定两次或解锁两次。你想要的东西是信号量:See Here。信号量有计数器,每个WaitOne计数器减1后,Release计数器每次调用后增加1。

答案 1 :(得分:0)

.NET System.Threading.Mutex类使用可重入的Win32内核互斥对象。来自the documentation的以下注释说明了正确用法:

  

拥有互斥锁的线程可以在重复调用WaitOne时请求相同的互斥锁,而不会阻止其执行。但是,线程必须多次调用ReleaseMutex方法才能释放互斥锁的所有权。

然后很明显,操作系统正在计算进入互斥锁的次数-它不是“已锁定或已解锁”的二进制状态(除了计数之外,还有“已放弃”的其他状态)。