是否持有互斥锁调用pthread_cond_broadcast?

时间:2009-07-09 17:11:33

标签: c locking pthreads

使用pthread_cond_t我们必须关联互斥锁,当发出信号时我看到的代码如

pthread_mutex_lock(&mutex);

//code that makes condition true

pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);

pthread_mutex_lock(&mutex);

//code that makes condition true

pthread_mutex_unlock(&mutex);
pthread_cond_broadcast(&cond);

哪一个是正确的方法? (这有关系吗?)

1 个答案:

答案 0 :(得分:14)

取决于接收器正在做什么(以及任何其他来源)。

在你的第二个代码示例中,有可能在解锁和广播之间,一堆其他线程会出现并做一些事情的组合,这使得条件再次变为假。然后你将毫无意义地进行广播。当你改变条件时,你不一定会有同样的服务员,这可能会或可能不会影响你的设计。

一个体面的水槽不应该关心它是否被唤醒并且条件是错误的,特别是如果你正在使用广播。只要条件的每次变化最终都是广播后,我很确定通过适当写入的接收器,您可以无论是否锁定都可以无条件地广播条件变量。

所以我不认为这真的很重要,但我个人只是为了避免担心它而持有锁定广播。 “原子变化和信号”可能会简化白板上的状态图,而不是“改变......一段时间之后,信号”。

两者都是正确的(不同于没有互斥的等待,这是不允许的),但我认为在第二种情况下提出可能出错的用途并不会太难,第一个错了。不过,他们可能不得不让一些服务员做一些不寻常的事情。

规范相当隐秘地说“如果需要可预测的调度行为,那么该互斥锁将被调用pthread_cond_broadcast()或pthread_cond_signal()的线程锁定。”

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html