实际问题是,我尝试将新参数发送到正在运行的线程。 想法是改变线程中的变量,这不起作用。 代码应该显示问题的简单示例。 更新后打印的变量测试应为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;
}
答案 0 :(得分:1)
必须使用称为&#34; atomic的特殊类型的变量来访问多个线程中的变量。&#34;在这种情况下,因为它是一个int,所以应该写成std::atomic<int> test;
。
您可以阅读有关原子技术和C ++内存模型here的技术细节的更多信息。
答案 1 :(得分:-3)
在我看来,您应该将test
整数成员声明为volatile
。
volatile int test = 0;
您有2个线程正在访问同一个变量。在不声明volatile的情况下,编译器可以优化内存读/写访问,这可能会导致这种影响。