加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c 11线程拼图中的仿函数

发布时间:2020-12-16 07:28:42 所属栏目:百科 来源:网络整理
导读:请考虑以下代码段.使用GCC 4.6.1,x变为0,y变为1. 为什么在使用和不使用单独的线程时会得到不同的结果?我应该如何修改代码,以便两个版本产生相同的结果(即整数值增加1?) 谢谢. struct functor{ void operator()(int x){ ++x; } };void tfunc(functor f,int
请考虑以下代码段.使用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参数移动构造的.这意味着

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读