C++ std::condition_变量的谓词是否在锁下执行?

C++ std::condition_变量的谓词是否在锁下执行?,c++,c++11,C++,C++11,As条件变量可以检查给定谓词是否为真,并仅在为真时返回(如下面的代码段),谓词是否在条件变量中包含的锁保护内运行(mutex m在下面的代码段中) std::条件变量cv; std::互斥m; std::唯一锁lk; wait(lk,[]{/*谓词*/}); 采用谓词的wait()版本相当于: while (!pred()) wait(lock); while (!p()) cv.wait(lk); 因此,谓词在wait(lock)调用外部被检查(锁仅在该调用内部被解锁),这

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

std::条件变量cv;
std::互斥m;
std::唯一锁lk;
wait(lk,[]{/*谓词*/});
采用谓词的
wait()
版本相当于:

while (!pred())
    wait(lock);
while (!p())
    cv.wait(lk);
因此,谓词在
wait(lock)
调用外部被检查(锁仅在该调用内部被解锁),这意味着在检查谓词时锁被锁定。

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

while (!pred())
    wait(lock);
while (!p())
    cv.wait(lk);
此外,
wait
的先决条件是调用线程持有锁。因此,的确,谓词检查发生在锁下

除此之外的任何行为都没有多大意义,因为否则检查谓词将产生数据竞争,除非您为谓词提供单独的同步机制