5

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

4

4 回答 4

8

FIFO 信号导致锁定车队。在较新版本的 Win32 API 上,convoy 问题通过 macking 互斥锁和其他显式不公平的同步原语(即没有 FIFO)来解决。

如果多个线程在互斥体上等待,则选择一个等待线程。不要假设先进先出 (FIFO) 顺序。内核模式 APC 等外部事件可以更改等待顺序。

于 2009-10-09T17:42:40.003 回答
0

是的,如果您想要一个 FIFO 队列,您需要实现自己的排队机制。

于 2009-10-09T18:44:42.727 回答
0

如果您希望解锁按 FIFO 顺序进行,您可以使用自定义锁。ACE 中存在 FIFO 锁;它被称为 ACE_Token,由于它是开源的,也许您可​​以将其用作参考实现。我认为使用它的开销将是最小的。

于 2009-10-11T10:39:19.953 回答
0

Windows 进行自己的调度的方法是使用光纤。主线程将在互斥体上等待,一旦它返回,您就可以从线程安全队列 (FIFO) 中显式调用 SwitchToFiber。

  1. 调用 SwitchToFiber 的线程需要调用 ConvertThreadToFiber
  2. SwitchToFiber 中的函数应该从 QUEUE 调用 SwitchToFiber
于 2009-10-14T11:13:10.900 回答