-1

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

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

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

4

2 回答 2

4

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

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

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

于 2019-06-05T16:47:25.133 回答
0

互斥锁只有两种状态:锁定或解锁。它不能被锁定两次或两次解锁。您想要的是信号量:请参阅此处。信号量有计数器,每次WaitOne计数器减1,每次调用Release计数器后加1。

于 2018-05-15T22:34:03.670 回答