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参数移动构造的.这意味着 >线程函数获取参数的副本,和 所以通过引用传递东西是行不通的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |