由于条件变量可以检查给定的断言是否是真还是假,并返回只有当它是真实的(如下面代码段),是谓词锁的保护内部运行包含在条件变量(以下片断mutex m
)?std :: condition_variable的谓词是否在锁定下执行?
std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lk;
cv.wait(lk, []{/*predicate*/});
由于条件变量可以检查给定的断言是否是真还是假,并返回只有当它是真实的(如下面代码段),是谓词锁的保护内部运行包含在条件变量(以下片断mutex m
)?std :: condition_variable的谓词是否在锁定下执行?
std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lk;
cv.wait(lk, []{/*predicate*/});
呼叫cv.wait(lk, p)
由[thread.condition.condvar]中定义为等同于:
while (!p())
cv.wait(lk);
此外,对于wait
前提是调用线程持有锁。因此,确实,谓词检查发生在锁定下。比这个行为的其他
什么也不会做了很多有意义的,因为否则检查谓词会产生数据竞争,除非你能提供的谓词单独同步机制。
的wait()
,需要一个谓词版本等同于:
while (!pred())
wait(lock);
因此,谓词的wait(lock)
呼叫外部检查(及锁是否是该呼叫的内部仅未锁定),这意味着当检查谓词时锁定被锁定。