如果我锁定了2个互斥体,并且每个互斥体都有一个condvar,有没有简单的方法可以等待或者 condvar发射?我想再次拿着两把锁,并且(至少)其中一个已经发出了信号。两个互斥体condvar
回答
重新设计?不太了解你想做什么:尝试使用一个互斥体和多个condvars。如果你想等待condvar做出第三个condvar,当第一个或第二个被触发时(或类似的东西)就会被触发。
没有简单的方法,我可以看到,我会创建第三个condvar和mutex,因为你真的在等待不同的条件。
不可以。您最终会遇到竞争状况。假设两个信号都在pthread_cond_wait
返回之前发送。一个人会被扔掉,而他们无法区分。
正如卢克所言,另一种思考方式是发生两种不同的情况。当您收到信号时,请仔细检查情况。如果有两个条件,如果其他条件可能在您检查时发生变化,则显然会出现竞争状态。
解决方案是有两个不同的线程。如果这些线程需要独占,请使用另一个锁来同步它们。
只需编写完全符合您需要的同步功能即可。这样做并没有什么内建的,但写起来非常简单。
一种方法是拥有一个主等待表,由它自己的互斥锁保护。等待,您分配一个新的条件变量和新的等待对象。用等待的内容和新的条件变量填写等待对象。您获取主等待表互斥量,将您的对象添加到主等待表中,并阻止您自己的条件变量。要发出信号,你需要改变谓词是什么,获得主等待表上的互斥量,查看哪些线程符合条件,并发出每个专用条件变量的信号。
在唤醒时,您必须获取单个互斥锁并重新检查单个谓词。它不会自动完成。
但最有可能的是,正确的解决方案是重新设计。最合乎逻辑的重新设计 - 为什么一个线程等待两种不同的条件?如果有两件事情可能发生,两件事情发生时需要做两件事情,那么为什么一个线程做这两件事?
通常,最好的设计更改是没有线程等待这些事情。相反,当需要完成工作时,让发现需要完成工作的条件的线程将工作项添加到队列中。然后工作线程可以等待作业放置在该队列中。如果需要处理两个不同的条件,则可以由任何线程完成两个作业。
- 1. 为什么默认不实施互斥,RWLock,CondVar,持续时间?
- 2. 为什么互斥体不需要互斥体(并且该互斥体需要互斥体...)
- 3. Node.js和互斥体
- 4. Ruby和互斥体
- 5. EventQueues和互斥体
- 6. 互斥体机制
- 7. 提升interprocess互斥体vs提升线程互斥体
- 8. 使用Allegro互斥体创建互斥体类
- 9. 在运行时选择互斥体或虚拟互斥体
- 10. 互斥或不互斥互斥?
- 11. Silverlight中的互斥体
- 12. Linux内核互斥体
- 13. 线程和互斥体
- 14. Single Cron-Instance /互斥体
- 15. SQLite多线程互斥体
- 16. Windows Phone IsolatedStorageSettings&互斥体
- 17. 互斥体未初始化
- 18. 互斥体如何工作?
- 19. 如何使用互斥体
- 20. Win32中的互斥体
- 21. 用互斥体重建sem_wait()?
- 22. 分布式互斥体
- 23. AIX是互斥体sempahores?
- 24. 跨用户C#互斥体
- 25. 与smp的Java互斥体
- 26. 如何测试两个pthread互斥体的相等性?
- 27. 两个相互排斥的UIViews战略
- 28. 如何制作两个互斥的checkboxlists?
- 29. 多进程,一个互斥体
- 30. 多个互斥体上的Windows同步
不幸的是,这是一个测试,我不能真正得到其中一个互斥体。我想我会继续嘲笑更多的东西,直到我下降到一个互斥量。 – 2010-07-29 18:24:42