我试图使用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