由於條件變量可以檢查給定的斷言是否是真還是假,並返回只有當它是真實的(如下面代碼段),是謂詞鎖的保護內部運行包含在條件變量(以下片斷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)
呼叫外部檢查(及鎖是否是該呼叫的內部僅未鎖定),這意味着當檢查謂詞時鎖定被鎖定。