std :: condition_variable的谓词是否在锁定下执行?

时间:2014-11-06 05:29:17

标签: c++ c++11

由于条件变量可以检查给定谓词是否为真,并且仅当它为真时才返回(如下面的代码片段),是否在条件变量(mutex m中包含的锁保护内运行的谓词下面的片段)?

std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lk;

cv.wait(lk, []{/*predicate*/});

2 个答案:

答案 0 :(得分:2)

采用谓词的wait()版本等同于:

while (!pred())
    wait(lock);

因此,在wait(lock)调用之外检查谓词(锁定仅在该调用内部解锁),这意味着在检查谓词时锁定被锁定。

答案 1 :(得分:2)

调用cv.wait(lk, p)由[thread.condition.condvar]定义为等同于:

while (!p())
    cv.wait(lk);

此外,wait的前提条件是调用线程持有锁。因此,确实如此,谓词检查发生在锁定下。

除了这种行为之外的任何事情都没有多大意义,因为否则检查谓词会产生数据竞争,除非你为谓词提供单独的同步机制。