c 11线程拼图中的仿函数

请考虑以下代码段.使用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参数移动构造的.这意味着

>线程函数获取参数的副本,和
>原件很可能在销毁过程中被销毁.

所以通过引用传递东西是行不通的.

点赞