调用 pthread_cond_broadcast 是否持有互斥量?

标签 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);

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

最佳答案

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

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

一个体面的接收器不应该关心它是否被唤醒并且条件为假,尤其是当您使用广播时。只要每次将条件更改为“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/

相关文章:

c - C 的结构化模块接口(interface)

c - POSIX 系统上的内存映射文件保持同步

c - 与 C 中的结构和指针相关的问题

java - 可以从一个线程转移到另一个线程的锁

linux - 避免同一 bash 脚本的两个实例

c++ - 简单的线程! C++

在 C 中创建没有 pthread_join 的线程

c++ - 使用 fread/fwrite 将文件复制到 USB 的性能

java - 如何在 Android 中创建锁 (concurrent.locks.Lock)?

c - 程序在运行过程中丢失内存引用