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,我已经更正了这方面的答案。