2

假设我有三个线程都通过互斥锁访问相同的互斥部分。

让我给你这个例子。

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

//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 之间获得所有权完全是任意的?

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

4

2 回答 2

5

可以肯定地说,出于您的目的,它是任意的,因为操作系统将唤醒等待互斥锁的线程之一并将其授予线程,但关于哪个线程的决定是不确定的。

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

于 2013-03-13T19:59:30.510 回答
2

在 Vista 和 Windows Server 2003 SP1 之前,锁定原语试图提供公平 (FIFO)。由于公平导致锁车队,自 Vista 和 Windows Server 2003 SP1 以来,锁定原语明显不公平(无 FIFO)。请参阅Windows Server 2003 SP1 和 Windows Vista 中的反护航锁以及链接的文章。

于 2013-03-13T23:12:36.433 回答