由互斥锁阻止的等待线程的执行顺序

时间:2009-10-09 17:36:48

标签: windows multithreading mutex

我有一个互斥锁,用于控制从多个线程访问单个对象。线程完成后,互斥锁被解锁以允许订单线程对该对象进行操作。在Windows上使用WaitForSingleObject函数是否有一个命令线程被发信号?我希望现在允许第一个尝试锁定互斥锁的线程锁定互斥锁。这将是一个FIFO队列,因此发送到被阻塞线程的信号不是随机的。我是否必须实现自己的排队机制来实现这一目标?如果是这样,哪些功能有用?

4 个答案:

答案 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。

  1. 调用SwitchToFiber的线程需要调用ConvertThreadToFiber
  2. SwitchToFiber中的功能应该从QUEUE
  3. 调用SwitchToFiber