互斥锁所有权队列顺序

c00*_*0fd 2 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);
Run Code Online (Sandbox Code Playgroud)

然后10毫秒后,线程2也请求它:

//THREAD 2
//TIME: 2013-03-13 01:00:00.010Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
Run Code Online (Sandbox Code Playgroud)

20毫秒后,线程3也请求它:

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

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

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

Mik*_*scu 5

可以很自然地说,出于你的目的,它是任意的,因为操作系统会唤醒其中一个线程等待Mutex并将其授予线程,但决定哪个线程是非确定性的.

您可以使用全局优先级索引在线程之间实现自己的优先级方案.然后,如果其中一个等待Mutex的线程在没有进入第一线的情况下接收它,则立即将其放弃并继续等待直到Mutex再次可用.这应该重复,直到获取互斥锁并且根据线程的优先级索引与全局索引相比线程是先行的.