请考虑以下代码段.使用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;
}
最佳答案 很容易看出发生了什么.只需用不可复制的类型(一个带有私有拷贝构造函数)替换int,编译器就会找到libstdc尝试复制参数而不是使用引用的确切位置.在我的例子中,它是 中的第138行.标准标题.
无论这是否正确执行标准,我现在都说不清楚.
更新标准说std :: thread :: thread的每个参数都应该满足MoveConstructible的要求,并且传递给线程函数的实际参数是从std :: thread :: thread参数移动构造的.这意味着
>线程函数获取参数的副本,和
>原件很可能在销毁过程中被销毁.
所以通过引用传递东西是行不通的.