使用互斥锁作为条件变量

mon*_*ing 2 c c++ multithreading pthreads

给出条件变量的规范示例

pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);
Run Code Online (Sandbox Code Playgroud)

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

但是我没有看到只是尝试锁定互斥锁有什么问题,如果锁定被执行,那么线程将等待互斥锁被释放.

这种方法唯一的问题是持续轮询吗?

谢谢

Nem*_*emo 7

让我们具体化吧.您建议的条件变量替代方法是"服务员"执行此操作:

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

并为"信号"做到这一点:

    lock mutex
    make predicate true
    unlock mutex
Run Code Online (Sandbox Code Playgroud)

例如,"谓词"可能是"队列不为空".

这种方法存在两个问题.第一个是您确定的:持续轮询是低效的.如果你想象整个系统中有数百或数千个线程试图以这种方式运行,那么它将使系统陷入困境.或者你的"睡一会儿"必须这么长,以至于睡眠本身会加剧令人烦恼的延迟.

第二个问题更微妙.无法保证当线程解锁互斥锁然后再次锁定它时,将允许另一个等待该互斥锁的线程运行.(互斥体的这一特性被称为"公平"的,提供它被说成是"公平"的互斥量POSIX并没有要求互斥是公平的.)不管你在"服务员"睡多长时间,有没有保证"信号发生器",将以往任何时候都闯过了lock mutex电话.

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