c++ - 使用互斥量作为条件变量

标签 c++ c multithreading pthreads

给定条件变量的典型例子

pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);

然后我可以从另一个线程发送信号,这个线程将继续。

但我看不出仅仅尝试锁定互斥锁有什么问题,如果锁被占用,那么线程将等待互斥锁被释放。

这种方法的唯一问题是不断轮询吗?

谢谢

最佳答案

让我们具体化。您建议的条件变量替代方案是让“服务员”执行此操作:

loop:
    lock mutex
    check predicate
    if (predicate is false)
        unlock mutex
        sleep a bit // (is this what you had in mind?)
        goto loop

对于“信号员”来说:

    lock mutex
    make predicate true
    unlock mutex

在这里,“谓词”可能是“队列不为空”,例如。

这种方法有两个问题。第一个是您确定的那个:持续轮询效率低下。如果您想象整个系统中有成百上千个线程试图以这种方式运行,那么系统就会崩溃。或者你的“睡一会儿”必须很长,以至于 sleep 本身会增加恼人的延迟。

第二个问题更微妙。无法保证当一个线程解锁一个互斥量然后再次锁定它时,另一个等待该互斥量的线程将被允许运行。 (互斥锁的这个属性被称为“公平”;提供它的互斥锁被称为“公平”。POSIX 要求互斥锁是公平的。)无论你在“服务员”,无法保证“信号员”将永远通过其lock mutex 调用。

条件变量解决了这两个问题。

关于c++ - 使用互斥量作为条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6379443/

相关文章:

c++ - 将动态分配的二维字符数组传递给函数

c - 无法使回文检查起作用

android - Android 中的 fragment 和线程

java - 为什么将 TextField 绑定(bind)到正在另一个线程上更新的属性最终会导致应用程序抛出错误?

c++ - 将抽象重写方法传递给 Boost::Thread

c++ - 包含多行函数签名的 Vim foldexpr

将方程转换为 C 程序

c++ - 模板元编程列表

c++ - 编译器代码生成错误或内存损坏?

c++ - boost 中有一个 DAG 图,没有顶点描述符失效