11

使用 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);

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

4

1 回答 1

18

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

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

一个像样的接收器不应该关心它是否被唤醒并且条件是错误的,特别是如果你正在使用广播。只要每次将条件更改为“true”最终都会进行广播,我很确定使用适当编写的接收器,您可以在有或没有锁的情况下随意广播条件变量。

所以我认为这并不重要,但我个人会在持有锁的情况下进行广播,如果只是为了避免担心的话。与“改变......一段时间后,信号”相比,“原子变化和信号”可能会简化白板上的状态图。

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

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

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

于 2009-07-09T17:18:34.027 回答