在我的代码中,如果我的线程在调用 .ReleaseMutex() 之前多次调用 .WaitOne() 会很方便。
反之亦然:调用 .ReleaseMutex() 几次,然后重新启动以调用 .WaitOne() 开始的循环。
一些操作系统/编译器组合允许这样做。有些没有。
在我的代码中,如果我的线程在调用 .ReleaseMutex() 之前多次调用 .WaitOne() 会很方便。
反之亦然:调用 .ReleaseMutex() 几次,然后重新启动以调用 .WaitOne() 开始的循环。
一些操作系统/编译器组合允许这样做。有些没有。
.NETSystem.Threading.Mutex
类使用可重入的 Win32 内核互斥对象。文档中的以下注释解释了正确的用法:
拥有互斥锁的线程可以在重复调用中请求相同的互斥锁,
WaitOne
而不会阻塞其执行。但是,线程必须调用ReleaseMutex
相同次数的方法才能释放互斥锁的所有权。
显然,操作系统正在计算进入互斥锁的次数——它不是“锁定或解锁”的二进制状态(除了计数之外,还有一个“已放弃”的附加状态)。
互斥锁只有两种状态:锁定或解锁。它不能被锁定两次或两次解锁。您想要的是信号量:请参阅此处。信号量有计数器,每次WaitOne
计数器减1,每次调用Release
计数器后加1。