1

我在多个线程上实现等待和信号条件时遇到了问题。

线程需要锁定互斥体并等待条件变量,直到其他线程发出信号。同时,另一个线程锁定同一个互斥体并等待同一个条件变量。现在,在整个过程中同时运行的线程向条件变量发出信号,但我只希望必须向第一个等待的线程发出信号,而不是其他线程。

4

3 回答 3

5

如果两个线程在同一个条件变量上等待,它们必须准备好处理相同的条件,或者你必须小心地构造你的程序,这样它们就不会同时在条件变量上等待。

为什么这个通知必须由第一个线程而不是第二个线程处理?

使用两个单独的条件变量可能会更好。

于 2010-10-04T11:12:39.470 回答
2

用于pthread_cond_signal()唤醒其中一个线程。

但是,可能不止一个人被唤醒;这称为虚假唤醒。您需要一个变量来跟踪您的应用程序状态,如上面链接的手册页中所述。

于 2010-10-04T11:14:38.313 回答
0

你的要求是不可能的。你说“......我只希望第一个等待的线程必须发出信号,而不是其他线程。” 但是条件变量永远不会提供任何方法来确保线程不被发出信号。因此,如果您要求不得向线程发出信号,则不能使用条件变量。

您必须始终使用这样的条件变量:

while(NotSupposedToRun)
  pthread_cond_wait(...);

因此,如果线程在不应该唤醒的时候醒来,那么它while仍然是静止false的,并且线程只是重新进入睡眠状态。这是强制性的,因为 POSIX 不提供任何线程不会被唤醒的保证。如果需要,实现可以完全免费地实现pthread_cond_signal为对每个信号上的所有线程的调用pthread_cond_broadcast和解除阻塞。

因为条件变量是无状态的,所以实现永远不知道线程是否应该被唤醒。您的工作是pthread_cond_wait始终且仅在线程不应该运行时调用。

有关详细信息,请参阅 http://en.wikipedia.org/wiki/Spurious_wakeup 。

如果您不能while像上面那样为循环中的每个线程精确指定唤醒条件,则不应使用条件变量。

于 2011-08-28T12:41:47.813 回答