- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 std::condition_variable来自 C++11
,用于 UI 线程和工作线程之间的数据事务。
情况: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 由于工作线程函数中的错误而永远不会触发的情况?有什么办法可以在这里使用超时吗?
尝试了解它的工作原理:
我在许多示例中看到,他们在 condition_var.wait
周围使用 while 循环检查 bool 变量的状态。在变量上循环有什么意义? 我不能期望 m_my_condition_variable
在从其他线程调用 notify_one
时从 wait
返回吗?
最佳答案
最有可能发生的事情:您的工作线程拥有并持有互斥锁,直到计算完成。主线程必须等到它可以获取锁。 worker before 释放锁(在析构函数中)时将向 CV 发出信号,到那时,没有其他想要等待条件变量的线程可以获得它仍然占用的锁通知线程。因此,另一个线程在收到通知时永远没有机会等待条件变量,因为它只是在通知事件发生后设法获取锁,导致它无限等待。
解决方案是删除 MyClass::ThreadFunctionToCalculateValue() 中的锁获取,那里根本不需要,或者至少不应该。
但无论如何,你为什么要重新发明轮子?对于此类问题,std::future已创建:
auto future = std::async(std::launch::async, ComplexLogicToCalculateValue);
bool is_ready = future.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
auto result = future.get();
在这里,您可以轻松定义超时,您不必担心 condition_variables 等。
Cant I expect m_my_condition_variable to return out of wait when notify_one is called from other thread ?
No ,不完全是。虚假唤醒仍然可能发生。
关于C++:如何在 UI 线程和 worker std::thread 之间使用 std::condition_variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46620817/
此代码是实际项目代码的简化。主线程创建工作线程并使用 std::condition_variable 等待工作线程真正启动。在下面的代码中,std::condition_variable 在 curr
reference I'm using用以下方式解释这两者: wait_for "阻塞当前线程,直到条件变量被唤醒或在指定的超时时间之后" wait_until "阻塞当前线程,直到条件变量被唤醒或到
标题问题的较长版本是: On my machine, sizeof(std::condition_variable) is 72 bytes.What are these 72 bytes used
假设我有这样的事情: bool signalled = false; std::condition_variable cv; void thread1() { while (true) {
我在下面的代码中遇到错误。 recursive_mutex m_RecurMutex; condition_variable cond; unique_lock lock(m_RecurMutex);
这是什么: bool ready; boost::mutex mutex; boost::condition_variable cond; boost::unique_lock lock(mutex)
这个问题是关于condition_variable.wait()的功能。我认为它可能没有锁定 unique_lock当它被通知时立即。让我展示一下我的代码,您会更好地理解我的测试。 注意:编译器 g+
我是条件变量的新手,我想知道为什么计数器变量等于 99 之后的这段代码块?删除for循环并改用“counter += 99”使代码工作,它与sleep_for有什么关系吗?感谢您的帮助:) #incl
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
似乎 condition_variable notify_one 并不总是按应有的方式工作。 struct Task { std::mutex mutex; std::conditio
条件变量可用于向其他线程发出信号,表明发生了某些事情: mutex m; condition_variable cv; thread t1([&cv]{ // processing .
没有 std::condition_variable 的应用程序: #include #include #include #include #include #include std::m
首先是我的代码,让我的解释更清楚: struct Foo { std::condition_variable cv; }; static Foo* foo; // dynamically cr
std::condition_variable::notify_one() 或 std::condition_variable::notify_all() 是否保证非原子内存写入当前线程之前该调用将在
我目前正在对并发队列进行编程,同时学习如何使用C++ 11的多线程功能。 当使用者调用dequeue()函数且队列中没有任何条目时,该函数应等待,直到另一个线程调用enqueue()为止。我正在为此使
我有一个关于notify_one函数的问题。在下面的代码中, #include #include #include #include #include std::condition_vari
我有一个以下类(class)- boost::condition_varaible cond_; 当我尝试编译时- [rmitra @ butterfly boost] $ make EXE = th
这是一个小代码段 request_ptr pop() { request_ptr rp; std::unique_lock lock(cv_mtx); auto time =
假设我有一个包含std::queue的ThreadQueue类,并且我将每个std::ref的实例传递给线程。进一步假设,线程1(主线程)创建并保存ThreadQueue对象,并将消息倒入其中,第二个
我有课,用 queue的 std::function成员和方法 Push和 Pop . 我要实现加法PushAndWaitUntilExecuted .当你有一个时很容易consumer-thread
我是一名优秀的程序员,十分优秀!