C++ 互斥对象所有权队列顺序

C++ 互斥对象所有权队列顺序,c++,winapi,synchronization,mutex,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-

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

让我给你举个例子

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

//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和WindowsServer2003SP1,锁定原语明显不公平(没有FIFO)。请参阅和链接的文章。

不,您不能期望这些对象具有FIFO逻辑。