c++ - 互斥锁所有权队列顺序

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

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

最佳答案

可以肯定地说,就您的目的而言,操作系统将唤醒等待 Mutex 的线程之一并将其授予该线程,这是任意的,但是关于哪个线程的决定是不确定的.

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

关于c++ - 互斥锁所有权队列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395222/

相关文章:

c++ - 当 "required"运行时库不存在时显示(自定义)错误?

c++ - SetInputType 返回错误代码 c00d6d60

java - 同步方法还是整个队列?

java - 更多线程同步同一实例的方法

c++ - mingw 与 msvc 关于字符串文字的隐式转换

c++ - 我应该使用 C(99) boolean 值吗? (还有 C++ 中的 C++ boolean 值?)

c++ - 使用新的 lib 文件更新可执行文件而无需重新编译

c++ - 非类型参数包奇怪地展开

c++ - 将 char 转换为 std::string 不起作用

java - 如何锁定单个 ConcurrentHashMap 对象进行修改而不阻塞整个映射?