2010-07-29 76 views
1

如果我锁定了2个互斥体,并且每个互斥体都有一个condvar,有没有简单的方法可以等待或者 condvar发射?我想再次拿着两把锁,并且(至少)其中一个已经发出了信号。两个互斥体condvar

回答

0

重新设计?不太了解你想做什么:尝试使用一个互斥体和多个condvars。如果你想等待condvar做出第三个condvar,当第一个或第二个被触发时(或类似的东西)就会被触发。

+0

不幸的是,这是一个测试,我不能真正得到其中一个互斥体。我想我会继续嘲笑更多的东西,直到我下降到一个互斥量。 – 2010-07-29 18:24:42

1

没有简单的方法,我可以看到,我会创建第三个condvar和mutex,因为你真的在等待不同的条件。

0

不可以。您最终会遇到竞争状况。假设两个信号都在pthread_cond_wait返回之前发送。一个人会被扔掉,而他们无法区分。

正如卢克所言,另一种思考方式是发生两种不同的情况。当您收到信号时,请仔细检查情况。如果有两个条件,如果其他条件可能在您检查时发生变化,则显然会出现竞争状态。

解决方案是有两个不同的线程。如果这些线程需要独占,请使用另一个锁来同步它们。

0

只需编写完全符合您需要的同步功能即可。这样做并没有什么内建的,但写起来非常简单。

一种方法是拥有一个主等待表,由它自己的互斥锁保护。等待,您分配一个新的条件变量和新的等待对象。用等待的内容和新的条件变量填写等待对象。您获取主等待表互斥量,将您的对象添加到主等待表中,并阻止您自己的条件变量。要发出信号,你需要改变谓词是什么,获得主等待表上的互斥量,查看哪些线程符合条件,并发出每个专用条件变量的信号。

在唤醒时,您必须获取单个互斥锁并重新检查单个谓词。它不会自动完成。

但最有可能的是,正确的解决方案是重新设计。最合乎逻辑的重新设计 - 为什么一个线程等待两种不同的条件?如果有两件事情可能发生,两件事情发生时需要做两件事情,那么为什么一个线程做这两件事?

通常,最好的设计更改是没有线程等待这些事情。相反,当需要完成工作时,让发现需要完成工作的条件的线程将工作项添加到队列中。然后工作线程可以等待作业放置在该队列中。如果需要处理两个不同的条件,则可以由任何线程完成两个作业。