C编程中的并发线程

时间:2010-10-04 11:05:50

标签: c pthreads mutex condition-variable

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

使用pthread_cond_signal()唤醒其中一个主题。

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

答案 2 :(得分: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循环中精确指定每个线程的唤醒条件,你就不应该使用条件变量。