由于条件变量可以检查给定谓词是否为真,并且仅当它为真时才返回(如下面的代码片段),是否在条件变量(mutex m
中包含的锁保护内运行的谓词下面的片段)?
std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lk;
cv.wait(lk, []{/*predicate*/});
答案 0 :(得分:2)
采用谓词的wait()
版本等同于:
while (!pred())
wait(lock);
因此,在wait(lock)
调用之外检查谓词(锁定仅在该调用内部解锁),这意味着在检查谓词时锁定被锁定。
答案 1 :(得分:2)
调用cv.wait(lk, p)
由[thread.condition.condvar]定义为等同于:
while (!p())
cv.wait(lk);
此外,wait
的前提条件是调用线程持有锁。因此,确实如此,谓词检查发生在锁定下。
除了这种行为之外的任何事情都没有多大意义,因为否则检查谓词会产生数据竞争,除非你为谓词提供单独的同步机制。