所以我剛剛發現,如果您沒有在C++ 11中保存鎖定,則發出一個條件變量的信號是合法的。這似乎打開大門,一些討厭的競爭條件:無條件鎖定的條件變量上的信號
std::mutex m_mutex;
std::condition_variable m_cv;
T1:
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, []{ return !is_empty(); });
T2:
generate_data();
m_cv.notify();
能夠保證所有的T1將永遠在我們檢查is_empty(這種情況最終會)第(它返回true),然後讓由T2搶佔其創建一些數據並在實際等待之前發送條件變量的信號?
如果這是保證工作(我猜是這樣,否則它看起來像一個故意的糟糕的API設計),這是如何實現的說linux和stdlibc++
?似乎我們需要另一個鎖來避免這種情況。
是的,這是一個競爭條件的精確配方,就像http://stackoverflow.com/q/20982270/412080 –