pthread_cond_wait
允许我们等到条件变量发出信号。
但是,有没有机会等到两个条件变量中的任何一个发出信号?
我问的原因是我有以下情况:我有42个线程和两个可能的谓词,在这些谓词下这些线程可以继续工作。如果满足这两个谓词中的任何一个,他们可以继续工作。
但是,问题是,当满足其中一个谓词时,只有一个线程和一个特定线程,而不是任何线程,可以继续工作。如果另一个完成,则应恢复所有线程。
所以,我的想法是有一个条件变量,只要满足第二个pred就被广播......还有42个条件变量,每个变量与一个线程相关联。只要满足第一个预测,就会发出适当的信号。
但是这需要线程在发出一组给定的cond变量时发出警告...有机会实现这个吗?
答案 0 :(得分:0)
不,你只能等待一个条件变量。
然而,这很好。当一个线程从pthread_cond_wait()
中唤醒时,必须检查它正在等待的谓词实际上是否为真 - 这是因为等待条件变量被允许随时被唤醒(被称为"虚假的唤醒")。
因此,由于您的线程必须检查在pthread_cond_wait()
返回时是否允许它们继续,您可以使用与pthread_cond_broadcast()
配对的单个条件变量。线程本身确定(基于检查由互斥锁保护的共享状态)是单独允许它们继续还是应该继续等待。所以,像这样:
pthread_mutex_lock(&lock);
while (!this_thread_can_proceed(state) && !all_threads_can_proceed(state))
pthread_cond_wait(&cond, &lock);
或者,您可以使用相同的互斥锁等待多个条件变量(反过来不允许),这样您就可以让每个线程等待自己的条件变量,然后唤醒线程要么发出单个条件变量的信号,要么在集合上循环发出信号,这取决于它已经完成的谓词。
这些解决方案中哪一个能够更好地运行取决于"所有线程之间的平衡"和#34;一个线程"在你的申请中醒来。