nos*_*nos 8 c locking pthreads
使用pthread_cond_t,我们必须关联一个互斥锁,当发信号通知我见过的代码时,例如
pthread_mutex_lock(&mutex);
//code that makes condition true
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
Run Code Online (Sandbox Code Playgroud)
和
pthread_mutex_lock(&mutex);
//code that makes condition true
pthread_mutex_unlock(&mutex);
pthread_cond_broadcast(&cond);
Run Code Online (Sandbox Code Playgroud)
哪一个是正确的方法?(有关系吗 ?)
Ste*_*sop 14
取决于接收器正在做什么(以及任何其他来源).
在你的第二个代码示例中,有可能在解锁和广播之间,一堆其他线程会出现并做一些事情的组合,这使得条件再次变为假.然后你将毫无意义地进行广播.当你改变条件时,你不一定会有同样的服务员,这可能会或可能不会影响你的设计.
一个体面的水槽不应该关心它是否被唤醒并且条件是错误的,特别是如果你正在使用广播.只要每次条件变为"真实"后最终都会播出广播,我很确定通过适当写入的接收器,您可以无论是否锁定都可以广播一个条件变量.
所以我不认为这真的很重要,但我个人只是为了避免担心,我会用锁定进行广播."原子变化和信号"可以简化白板上的状态图,而不是"改变......一段时间之后,信号".
两者都是正确的(不同于没有互斥的等待,这是不允许的),但我认为在第二种情况下提出可能出错的用途并不会太难,这不会出错第一.不过,他们可能不得不让一些服务员做一些不寻常的事情.
该规范相当隐秘地说"如果需要可预测的调度行为,则该互斥锁应由调用pthread_cond_broadcast()或pthread_cond_signal()的线程锁定."
http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html