C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c 11线程拼图中的仿函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
虑以下代码段.使用GCC 4.6.1,x变为0,y变为1.

为什么在使用和不使用单独的线程时会得到不同的结果?我应该如何修改代码,以便两个版本产生相同的结果(即整数值增加1?)

谢谢.

@H_607_11@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参数移动构造的.这意味着

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

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

大佬总结

以上是大佬教程为你收集整理的c 11线程拼图中的仿函数全部内容,希望文章能够帮你解决c 11线程拼图中的仿函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。