互斥锁所有权队列顺序

Mutex ownership queue order

本文关键字:队列 顺序 所有权      更新时间:2023-10-16

假设我有三个线程,它们都通过互斥锁访问同一个互斥部分

让我给你举个例子。

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

//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之间的所有权?

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

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

你可以使用全局优先级索引来实现你自己的线程优先级方案。然后,如果等待互斥锁的一个线程收到它,而不是首行,它立即放弃它,继续等待,直到互斥锁再次可用。这个过程应该一直重复,直到互斥锁被获取,并且根据线程相对于全局索引的优先级索引,线程是第一行为止。

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