【发布时间】:2012-01-25 10:46:40
【问题描述】:
请考虑以下代码 sn-p。使用 GCC 4.6.1,x 变为 0 和 y 变为 1。
为什么使用和不使用单独的线程会得到不同的结果?我应该如何修改代码,以便两个版本产生相同的结果(即整数值增加 1?)
谢谢。
struct functor{
void operator()(int & x){
++x;
}
};
void tfunc(functor & f, int & x){
f(x);
}
int main(){
functor f;
int x = 0, y = 0;
std::thread t = std::thread(tfunc, f, x);
t.join();
std::cout << "with thread " << x << std::endl;
f(y);
std::cout << "without thread " << y << std::endl;
}
【问题讨论】:
-
尝试使
x不稳定。编译器在创建std::thread之后但在join返回之前获取其值是合法的。 -
@spraff:
volatile不能替代正确的同步(这也不是同步问题)。 -
更新。如果将
int *传递给tfunc而不是int &,它就可以工作。很奇怪。
标签: c++ multithreading c++11 functor