2009-10-09 73 views
4

我有一个互斥锁,用于控制从多个线程访问单个对象。当线程完成时,互斥锁被解锁以允许命令线程在对象上操作。在使用WaitForSingleObject函数的Windows上是否有线程被发信号的命令?我想让第一个锁定互斥体的线程现在被允许锁定互斥体。这将是一个先进先出队列,以便向被阻塞的线程发送信号不是随机的。我是否必须实现自己的排队机制来实现这一目标?如果是的话,哪些功能是有用的?等待线程被互斥锁阻塞的执行顺序

+0

你为什么要逼最大低效行为队列调用SwitchToFiber?如果你有三个孩子每个都想借这辆车去做三件事,那么完成所有九项工作的最有效方法不是让每个孩子做一份工作然后归还这辆车吗? – 2011-09-15 20:57:33

回答

5

FIFO信号导致lock convoys。在较新版本的Win32 API上,车队问题通过明确地填写互斥体和其他同步原语来解决(即没有FIFO)unfair

如果多于一个线程正在等待 互斥,一个等待的线程选择。 不要采用先进先出的 (FIFO)顺序。外部事件如 内核模式APC可以更改等待 的顺序。

+0

你说得很对,FIFO是明确不能保证的。但是,也有一个保证,即饥饿仍然可以避免。 – 2009-10-09 17:47:19

+0

@Steven:对。 Afaik周期性地将队列头部移动到尾部,这保证了没有*无限*饥饿。线程可能仍然会遇到*临时*饥饿。 – 2009-10-09 17:56:22

0

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

0

如果您想要以FIFO顺序进行解锁,您可以使用自定义锁定。 ACE中存在FIFO锁定;它被称为ACE_Token,并且由于它是开源的,因此您可以将其用作参考实现。我认为使用它的开销会很小。

0

Windows自己的日程安排方式是使用光纤。主线程将等待互斥锁,一旦它返回,您将显式调用线程安全队列(FIFO)中的SwitchToFiber。

  1. 线程调用SwitchToFiber需要调用ConvertThreadToFiber
  2. 在SwitchToFiber函数应该从