请考虑下面的代码片段。使用GCC 4.6.1,x
变为0
和y
变成1
。C++ 11线程拼图中的仿函数
为什么在使用和不使用单独的线程时会得到不同的结果?我应该如何修改代码以使两个版本的结果相同(即整数值增加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
@spraff:'volatile'不能代替正确的同步(并且这不是同步问题)。 –
更新。如果'int *'传递给'tfunc'而不是'int&',它就可以工作。特雷斯怪异。 – user92382