线程可以在调用 .ReleaseMutex() 之前多次调用 Mutex 的 .WaitOne() 吗?反之亦然?

Dou*_*ull 1 c# mutex recursive-mutex

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

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

某些操作系统/编译器组合允许这样做。有些则不然。

Ben*_*igt 7

.NETSystem.Threading.Mutex类使用可重入的 Win32 内核互斥对象。文档中的以下注释解释了正确的用法:

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

显然,操作系统正在计算进入互斥体的次数——它不是“锁定或解锁”的二进制状态(除了计数之外,还有一个附加状态“放弃”)。