在一个线程内进行的赋值在另一个线程中不可见
Assignment made inside a thread not visible in another thread
我正试图通过std::condition_variable
和bool condition
触发工作线程的执行。如果condition
为true,则工作者等待通知并开始工作。在工作condition
被设置为假之后。此外,还有一个互斥对象需要同步。
在主线程中,一个循环检查condition
是否为false,如果是这种情况,则condition
设置为true,并通知condition_variable。
当运行此代码时,我预计输出会"垃圾邮件"唤醒并工作,但它只执行一次,因为thread_function()
中对condition
的分配在主线程中不可见/在工作线程中丢失。输出表明,在赋值之后它是false,当使用调试器进行调试时,它在赋值之后是false,但当评估主线程中的if时,它再次为true。
我是不是错过了什么?
我在VS2013和VS2012中尝试过这一点,并试图用std::atomic_bool
替换bool
,但这也没有帮助。
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
#include <atomic>
bool condition;
std::mutex condition_mutex;
std::condition_variable cv;
void thread_function() {
while (true) {
std::unique_lock<std::mutex> lock(condition_mutex);
cv.wait(lock);
std::cout << "woke upn";
if (condition) {
// do stuff
std::cout << "thread workingn";
condition = false;
std::cout << "thread: " << (condition ? "true" : "false") << "n";
}
}
}
int main() {
condition = false;
std::thread t(&thread_function);
while (true) {
std::unique_lock<std::mutex> lock(condition_mutex);
// std::cout << "main: " << (condition ? "true" : "false") << "n";
if (!condition) {
condition = true;
cv.notify_one();
}
}
return 0;
}
您应该将锁放在while循环之外:
void thread_function() {
std::unique_lock<std::mutex> lock(condition_mutex);
while (true) {
cv.wait(lock);
std::cout << "woke upn";
if (condition) {
// do stuff
std::cout << "thread workingn";
condition = false;
std::cout << "thread: " << (condition ? "true" : "false") << "n";
}
}
}
线程函数在重新进入循环时很快就会失去锁。这允许主线程在没有人等待的情况下调用cv.notify_one()
。
标准的等待方式包括测试条件,这将解决您的问题:
while (!condition) cv.wait(lock);
请参阅http://en.cppreference.com/w/cpp/thread/condition_variable/wait.
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 从C++11中的线程返回一个值
- qt多线程:计算一个积分
- volatile变量在一个客户线程和一个生产者线程中是否安全
- C++ pthread,两个线程读取一个全局变量
- 如何启动一个 boost::线程运行一个成员函数
- 如果另一个线程将一个元素推到向量的末尾,则向量上的迭代器无效
- Qt::线程是一个库还是仅仅是一个类
- 当一个线程锁定一个大映射时,如何避免冻结其他线程
- C++-如何让多个线程写入一个文件
- 为什么我的线程被一个关键部分阻塞,而没有被任何东西抓住
- 一个线程读一个线程写,std::deque是安全的
- 从c++线程发出一个信号
- 通信b/w两个线程在一个公共的数据结构.设计问题
- 如何使用boost运行线程另一个对象函数与回调
- 我可以在OpenMP分配多个线程到一个代码段
- 当我从线程B读取相同的变量时,我能从线程a写入一个变量吗
- 线程中一个套接字发送/接收
- 跨线程发送一个glib信号
- 用一个插入线程和一个读线程映射并发性