比方说,如果我有三个线程都通过互斥锁访问相同的互斥部分。
让我举个例子。
第一个线程探测互斥锁并首先获得其所有权:
//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?
如果它与互斥锁是任意的,如何确保第一个等待的线程首先获得所有权?
答案 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和相关文章。