我有一个互斥锁,用于控制从多个线程访问单个对象。线程完成后,互斥锁被解锁以允许订单线程对该对象进行操作。在Windows上使用WaitForSingleObject函数是否有一个命令线程被发信号?我希望现在允许第一个尝试锁定互斥锁的线程锁定互斥锁。这将是一个FIFO队列,因此发送到被阻塞线程的信号不是随机的。我是否必须实现自己的排队机制来实现这一目标?如果是这样,哪些功能有用?
答案 0 :(得分:6)
FIFO信令导致lock convoys。在较新版本的Win32 API上,通过明确地使用互斥和其他同步原语来解决护航问题unfair(即没有FIFO)。
如果有多个线程在等待 一个互斥锁,一个等待的线程被选中。 不要假设先进先出 (FIFO)订单。外部事件如 内核模式APC可以改变等待 顺序。
答案 1 :(得分:0)
是的,如果你想要一个FIFO队列,你需要实现自己的排队机制。
答案 2 :(得分:0)
如果您希望以FIFO顺序进行解锁,则可以使用自定义锁定。 ACE中存在FIFO锁定;它被称为ACE_Token,因为它是开源的,也许您可以将它用作参考实现。我认为使用它的开销很小。
答案 3 :(得分:0)
Windows自行安排的方法是使用光纤。主线程将在互斥锁上等待,一旦它返回,你就从一个线程安全的QUEUE(FIFO)显式调用SwitchToFiber。