比方说,如果我有三个线程都通过互斥锁访问同一个互斥部分。
让我举个例子。
第一个线程探测互斥锁并首先获得它的所有权:
//THREAD 1
//TIME: 2013-03-13 01:00:00.000Z
WaitForSingleObject(hMutex, INFINITE);
//Performs the operation that lasts 50 ms
ReleaseMutex(hMutex);
然后 10 毫秒后线程 2 也请求它:
//THREAD 2
//TIME: 2013-03-13 01:00:00.010Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
20 毫秒后线程 3 也请求它:
//THREAD 3
//TIME: 2013-03-13 01:00:00.030Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
在这种情况下,我能否确定线程 2 总是会在线程 3 之前获得互斥锁所有权(因为它可以说是“排在第一位”),或者谁在线程 2 和线程 3 之间获得所有权完全是任意的3?
如果互斥锁是任意的,如何确保第一个等待的线程首先获得所有权?
最佳答案
可以肯定地说,就您的目的而言,操作系统将唤醒等待 Mutex 的线程之一并将其授予该线程,这是任意的,但是关于哪个线程的决定是不确定的.
您可以使用全局优先级索引在线程之间实现自己的优先级方案。然后,如果等待 Mutex 的线程之一接收到它但不是 first-in-line 它会立即放弃它并继续等待直到 Mutex 再次可用。这应该重复,直到获取互斥锁并且根据与全局索引相比线程的优先级索引,该线程是第一线。
关于c++ - 互斥锁所有权队列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395222/