更新线程变量(c ++)

时间:2017-01-14 14:17:13

标签: multithreading c++11

实际问题是,我尝试将新参数发送到正在运行的线程。 想法是改变线程中的变量,这不起作用。 代码应该显示问题的简单示例。 更新后打印的变量测试应为1,但始终为0。 有人理解这个问题并且可以提供帮助吗? 非常感谢!

#include <iostream>
#include <thread>

class MyThread {
public:
int test = 0;
void operator()() const {
    while (1)
    std::cout << test << std::endl;
}
/* other public or private class members */
};

int main() {
    MyThread mythread;
    std::thread t(mythread);
    mythread.test = 1;
    t.join();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

必须使用称为&#34; atomic的特殊类型的变量来访问多个线程中的变量。&#34;在这种情况下,因为它是一个int,所以应该写成std::atomic<int> test;

您可以阅读有关原子技术和C ++内存模型here的技术细节的更多信息。

答案 1 :(得分:-3)

在我看来,您应该将test整数成员声明为volatile

volatile int test = 0;

您有2个线程正在访问同一个变量。在不声明volatile的情况下,编译器可以优化内存读/写访问,这可能会导致这种影响。