我有一个互斥锁,用于控制从多个线程访问单个对象。当线程完成时,互斥锁被解锁以允许命令线程在对象上操作。在使用WaitForSingleObject函数的Windows上是否有线程被发信号的命令?我想让第一个锁定互斥体的线程现在被允许锁定互斥体。这将是一个先进先出队列,以便向被阻塞的线程发送信号不是随机的。我是否必须实现自己的排队机制来实现这一目标?如果是的话,哪些功能是有用的?等待线程被互斥锁阻塞的执行顺序
回答
FIFO信号导致lock convoys。在较新版本的Win32 API上,车队问题通过明确地填写互斥体和其他同步原语来解决(即没有FIFO)unfair。
如果多于一个线程正在等待 互斥,一个等待的线程选择。 不要采用先进先出的 (FIFO)顺序。外部事件如 内核模式APC可以更改等待 的顺序。
你说得很对,FIFO是明确不能保证的。但是,也有一个保证,即饥饿仍然可以避免。 – 2009-10-09 17:47:19
@Steven:对。 Afaik周期性地将队列头部移动到尾部,这保证了没有*无限*饥饿。线程可能仍然会遇到*临时*饥饿。 – 2009-10-09 17:56:22
是的,如果你想要一个FIFO队列,你需要实现你自己的排队机制。
如果您想要以FIFO顺序进行解锁,您可以使用自定义锁定。 ACE中存在FIFO锁定;它被称为ACE_Token,并且由于它是开源的,因此您可以将其用作参考实现。我认为使用它的开销会很小。
Windows自己的日程安排方式是使用光纤。主线程将等待互斥锁,一旦它返回,您将显式调用线程安全队列(FIFO)中的SwitchToFiber。
- 线程调用SwitchToFiber需要调用ConvertThreadToFiber
- 在SwitchToFiber函数应该从
- 1. 线程阻塞后等待
- 2. 当锁定操作等待时,线程永远被阻塞
- 3. 互斥锁是否阻塞了所有线程?
- 4. 互斥锁:“阻塞”是什么意思?
- 5. 互斥锁的顺序
- 6. 这些线程中的每一个都等待,直到互斥锁被解锁以执行一个函数?
- 7. 当线程被内部锁定阻塞时执行代码
- 8. 如何在OpenMP上等待互斥锁
- 9. 多线程:阻塞等待超时
- 10. 如何避免多线程程序因线程等待而被阻塞
- 11. C++等待互斥
- 12. 多线程和互斥锁
- 13. 被阻塞的线程在WebLogic上等待logback SiftingAppender
- 14. 多线程互斥锁可以使用多个互斥锁
- 15. 尝试锁互斥锁或等待,直到解锁
- 16. 非阻塞等待
- 17. 在Boost进程搜索中,线程停留在互斥锁中等待managed_shared_memory
- 18. 在循环中阻塞相当于空的互斥锁?
- 19. 等待执行程序服务线程
- 20. 无法用互斥锁执行第一个线程
- 21. 等待线程完成而不阻塞UI线程
- 22. 使我线程等待,不阻塞子线程
- 23. 如何等待,直到互斥锁解锁?
- 24. 在使用互斥锁和等待数据时出现死锁
- 25. 阻塞队列+线程+执行线程的序列
- 26. Posix线程与互斥锁的同步
- 27. 线程在同一互斥锁的多个锁上的行为
- 28. 互斥锁同步为何阻止执行?
- 29. 线程安全的并行线程互斥锁包装
- 30. C++互斥锁 - 检查另一个线程是否正在等待
你为什么要逼最大低效行为队列调用SwitchToFiber?如果你有三个孩子每个都想借这辆车去做三件事,那么完成所有九项工作的最有效方法不是让每个孩子做一份工作然后归还这辆车吗? – 2011-09-15 20:57:33