互斥锁所有权队列顺序

时间:2013-03-13 19:57:27

标签: c++ winapi synchronization mutex

比方说,如果我有三个线程都通过互斥锁访问相同的互斥部分。

让我举个例子。

第一个线程探测互斥锁并首先获得其所有权:

//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 ms后线程3也请求它:

//THREAD 3
//TIME: 2013-03-13 01:00:00.030Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);

在这种情况下,我可以确定线程2将始终在线程3之前获得互斥锁所有权(因为它可以说是“第一线”),或者它是否完全随意获得线程2和线程2之间的所有权3?

如果它与互斥锁是任意的,如何确保第一个等待的线程首先获得所有权?

2 个答案:

答案 0 :(得分:5)

可以非常安全地说,出于您的目的,它是任意的,操作系统将唤醒其中一个线程等待Mutex并将其授予线程,但是决定哪个线程是非确定性的

您可以使用全局优先级索引在线程之间实现自己的优先级方案。然后,如果等待Mutex的其中一个线程接收到它而不是 first-in-line ,它会立即放弃它并继续等待直到Mutex再次可用。这应该重复,直到获取Mutex并且线程 first-in-line 根据线程的优先级索引与全局索引进行比较。

答案 1 :(得分:2)

在Vista和Windows Server 2003 SP1之前,锁定原语试图提供公平性(FIFO)。由于公平导致锁定车队,因为Vista和Windows Server 2003 SP1的锁定原语显然是不公平的(没有FIFO)。请参阅Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista和相关文章。