如果我锁定了2个互斥锁,并且每个都有一个condvar,是否有一种简单的方法可以等待 condvar触发?我想再次拿着两个锁,并且(至少)其中一个condvars已被发出信号。
答案 0 :(得分:1)
我看不出任何简单的方法,我只会创建第三个condvar和mutex,因为你真的在等待不同的条件。
答案 1 :(得分:0)
没有。你最终会遇到竞争条件。想象一下,在pthread_cond_wait
返回之前发送两个信号。一个被扔掉了,它们没有区别。
另一种思考方式,正如卢克所说,有两种不同的情况正在发生。当您收到信号时,请仔细检查条件。如果有两个条件,如果在检查时其他条件可能发生变化,则显然存在竞争条件。
解决方案是拥有两个不同的线程。如果这些线程需要是独占的,请使用另一个锁来同步它们。
答案 2 :(得分:0)
重新设计?不太了解您想要做什么:尝试使用一个互斥锁和多个condvars。如果你想要等待condvar,那么每当第一个或第二个被触发时就会触发第三个condvar(或类似的东西)。
答案 3 :(得分:0)
只需编写完全符合您要求的同步函数即可。没有内置任何内容,但写起来非常简单。
一种方法是拥有一个主等待表,由其自己的互斥锁保护。要等待,您需要分配一个新的条件变量和新的等待对象。你用你正在等待的东西和你的新条件变量填写等待对象。您获取主等待表互斥锁,将您的对象添加到主等待表,并阻止您自己的条件变量。要发出信号,您可以更改谓词的所有内容,获取主等待表上的互斥锁,查看哪些线程满足其条件,并发出每个专用条件变量的信号。
在唤醒时,您必须获取单个互斥锁并重新检查单个谓词。它不会自动完成。
但最有可能的是,正确的解决方案是重新设计。最合乎逻辑的重新设计 - 为什么一个线程在等待两个不同的条件?如果有两件事可能发生,两件事情发生时需要完成,为什么一个线程同时做两件事?
通常,最好的设计变化是没有线程等待这些事情。相反,当需要完成工作时,让发现条件的线程需要完成工作,将工作项添加到队列中。然后工作线程可以等待将作业放在该队列上。如果需要处理两个不同的条件,则任何线程都可以完成两个作业。