互斥锁所有权队列顺序
Mutex ownership queue order
假设我有三个线程,它们都通过互斥锁访问同一个互斥部分
让我给你举个例子。
第一个线程探测互斥锁并首先获得它的所有权:
//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中的反护航锁以及链接的文章。
相关文章:
- boost::进程间消息队列引发错误
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我已经做了一个程序来使用队列链C++表显示学生姓名和身高,现在我想以我不知道如何显示的顺序显示它
- 如何以相反的顺序将整个向量复制到队列中
- 队列顺序中的链接列表
- C++优先级队列不遵循 FIFO 顺序
- 使用队列在二进制树中的水平顺序遍历
- C++ 中的优先级队列在 pop() 之后顺序不正确
- 按特定顺序打印队列
- 以正确的顺序输出队列
- STL 优先级队列按递增顺序排列
- C++队列中读/写操作的顺序
- 在同一优先级队列中创建递增和递减顺序选项
- 对的优先级队列以相反的顺序排列
- 使用容量受限的队列按顺序列出字符串
- 反转优先级队列中元素的顺序
- 优先级队列的反向顺序
- 互斥锁所有权队列顺序
- 从相同的结构体以相反的顺序创建两个优先级队列
- Qt队列连接中的插槽调用顺序