对于 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);
哪一个是正确的方法? (有关系吗?)
最佳答案
取决于接收器(以及任何其他来源)在做什么。
在您的第二个代码示例中,在解锁和广播之间,可能会出现许多其他线程并执行一些组合操作,从而使条件再次为假。然后你就会毫无意义地广播。并且您不一定会拥有与更改条件时相同的一组服务员,这可能会或可能不会影响您的设计。
一个体面的接收器不应该关心它是否被唤醒并且条件为假,尤其是当您使用广播时。只要每次将条件更改为“true”最终都会进行广播,我很确定使用适当编写的接收器,无论有无锁定,您都可以随意广播条件变量。
所以我认为这并不重要,但就我个人而言,我会在锁定的情况下进行广播,即使只是为了避免担心。与“改变......稍后发出信号”相比,“原子变化和信号”可能会简化白板上的状态图。
两者都是正确的(不像没有互斥量的等待,这是不允许的),但我认为在第二种情况下想出可能出错的用途不会太难,那不会一开始就错了。不过,他们可能不得不让一些服务员做一些稍微不寻常的事情。
规范相当隐晦地说“如果需要可预测的调度行为,则该互斥量应由调用 pthread_cond_broadcast() 或 pthread_cond_signal() 的线程锁定。”
http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html
关于调用 pthread_cond_broadcast 是否持有互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1105250/