2014-11-06 61 views
1

由于条件变量可以检查给定的断言是否是真还是假,并返回只有当它是真实的(如下面代码段),是谓词锁的保护内部运行包含在条件变量(以下片断mutex m)?std :: condition_variable的谓词是否在锁定下执行?

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

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

回答

2

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

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

此外,对于wait前提是调用线程持有锁。因此,确实,谓词检查发生在锁定下。比这个行为的其他

什么也不会做了很多有意义的,因为否则检查谓词会产生数据竞争,除非你能提供的谓词单独同步机制。

2

wait(),需要一个谓词版本等同于:

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

因此,谓词的wait(lock)呼叫外部检查(及锁是否是该呼叫的内部仅未锁定),这意味着当检查谓词时锁定被锁定。