pthreads_cond_wait()的工作原理

pthreads_cond_wait()的工作原理,c,pthreads,multiprocessing,C,Pthreads,Multiprocessing,我正在使用pthread\u cond\u wait(),但我仍然不确定它是如何工作的。我有更多的线程,它们可以完成这项工作: pthread_mutex_lock(&mutex); while(count() == 0){ pthread_cond_wait(&signal, &mutex); } //some critical section pthread_mutex_unlock(&mutex); 然后我有一个主线程,在这里我调用

我正在使用
pthread\u cond\u wait()
,但我仍然不确定它是如何工作的。我有更多的线程,它们可以完成这项工作:

pthread_mutex_lock(&mutex);
while(count() == 0){
        pthread_cond_wait(&signal, &mutex);
    }
//some critical section
pthread_mutex_unlock(&mutex);
然后我有一个
主线程
,在这里我调用函数
pthread\u signal(&signal)

信号
之后,
唤醒了多少线程?这是正确的代码段吗

我正在使用pthread_cond_wait(),但我仍然不确定它是如何工作的

这似乎不明智

然后我有一个调用函数的主线程
pthread\u信号(&signal)

信号发出后有多少线程被唤醒

pthread\u cond\u signal()
唤醒至少一个当前正在等待条件变量的线程,前提是有任何此类线程要唤醒。如果在没有可用线程唤醒时调用,则它没有可观察的效果

如果有多个线程可以唤醒,那么可以唤醒多个线程,但通常的预期是只有一个线程被唤醒。但是,由于也可能出现虚假唤醒,正确解释
pthread_cond_wait()
pthread_cond_signal()
行为的整个范围的代码将具有正确的语义,无论有多少线程被唤醒,在接口的这一边,不可能区分哪些线程被信号唤醒,有多少线程被信号唤醒,哪些线程被错误唤醒

这是正确的一段 密码

您展示的代码摘录显示了使用条件变量的正确形式。特别是,在等待之前和唤醒之后但在继续之前,始终需要检查与CV关联的谓词。假设
count()==0
是正确的谓词,那么您的代码可以正确地执行此操作


然而,您的整个程序是否正确使用互斥和条件变量是一个单独的问题,您还没有提供足够的信息来回答这个问题。有时,像您这样的线程需要在离开临界区之前向条件变量发送信号。也可能是希望主线程执行
pthread\u cond\u broadcast()
,而不是执行
pthread\u cond\u signal()
。还有很多其他的可能性。

只有当它真的在等待时,它才会“醒来”。如果在该信号发出时没有线程等待cond var,那么它就变得无关紧要了。是的,该代码是正确的,除了缺少错误检查,并且假设
count()
没有锁存互斥锁本身。
pthread\u cond\u signal()
没有完全唤醒一个线程-它至少唤醒一个等待条件变量的线程(如果有)。一致性实现可以将
pthread\u cond\u signal
别名为
pthread\u cond\u broadcast
。谢谢,@caf,我已经更正了这方面的答案。