我試圖使用C++11
的std::condition_variable來處理UI線程&工作者線程之間的數據事務。C++:如何在UI線程和工作者std :: thread之間使用std :: condition_variable
情況:
m_calculated_value
是其中複雜的邏輯後算出的值。這是UI線程觸發事件所必需的。 UI線程調用MyClass::GetCalculatedValue
來獲取m_calculated_value
的值,該值需要由工作程序線程函數MyClass::ThreadFunctionToCalculateValue
進行計算。
代碼:
std::mutex m_mutex;
std::condition_variable m_my_condition_variable;
bool m_value_ready;
unsigned int m_calculated_value;
// Gets called from UI thread
unsigned int MyClass::GetCalculatedValue() {
std::unique_lock<std::mutex> lock(m_mutex);
m_value_ready = false;
m_my_condition_variable.wait(lock, std::bind(&MyClass::IsValueReady, this));
return m_calculated_value;
}
bool MyClass::IsValueReady() {
return m_value_ready;
}
// Gets called from an std::thread or worker thread
void MyClass::ThreadFunctionToCalculateValue() {
std::unique_lock<std::mutex> lock(m_mutex);
m_calculated_value = ComplexLogicToCalculateValue();
m_value_ready = true;
m_my_condition_variable.notify_one();
}
問題:
但問題是,m_my_condition_variable.wait
永遠不會返回。
問:
我在做什麼錯在這裏?
讓UI線程等待來自工作線程的條件變量信號是否正確?如何擺脫由於工作線程函數中的錯誤而導致condition_variable從不觸發的情況?有什麼辦法可以在這裏使用暫停嗎?
試圖瞭解它是如何工作:
我在許多例子中看到他們用while循環檢查condition_var.wait
周圍的布爾變量的狀態。什麼是變量的循環點? 當我從其他線程調用notify_one
時,我能期待m_my_condition_variable
返回wait
嗎?
你指的這些例子並沒有使用'等待()'與謂詞過載。因此他們基本上重新實現了那一個。無論如何,對於你的用例,你應該使用未來,而不是條件變量。 – Ext3h
當MyClass :: GetCalculatedValue返回時,我需要'm_calculated_value'準備好所需的值。這看起來像線程之間的一種典型信號情況,告訴數據已準備就緒。 @ Wxt3h你不這麼認爲嗎?未來將如何幫助這裏?你能再詳細一點嗎? –
我發現許多錯誤,但不會導致你的症狀。您提出了多個問題,但未能提供[mcve]。有關於如何使用條件變量的SO Q&A,我建議閱讀這些內容並按照他們的說法做。 – Yakk