2014-11-06 63 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)呼叫外部檢查(及鎖是否是該呼叫的內部僅未鎖定),這意味着當檢查謂詞時鎖定被鎖定。

相關問題