博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++线程传参问题
阅读量:6517 次
发布时间:2019-06-24

本文共 950 字,大约阅读时间需要 3 分钟。

std::thread可以和任何可调用类型一起工作,可调用对象和函数带有参数时,可以简单地将参数传递给std::thread的构造函数

例如:

1 #include
2 #include
3 using namespace std; 4 void hello(int a) 5 { 6 cout<
<

单重要的是,参数会以默认的方式复制到内存空间,即内存中存储的是参数的副本,在那里新创建的线程可以访问他们,而不是访问源参数

这就会带来一个问题,即当调用的函数参数为引用类型时,参数的值在函数体内改变时,希望源数据的值也发生改变,但实际情况是源数据值并不会发生。因为将data传递给线程的构造函数时,线程访问的是其在内存中的副本copydata,传递到可调用函数中的也是对这个副本的引用&copydata,那么函数体内对实参的改变也只是对内存中的副本进行了改变,而data并没有发生改变。当线程完成时,随着所提供参数副本的销毁,这些改变都将舍弃。

例如:

1 #incldue
2 #include
3 using namespace std; 4 void hello(int &a) 5 { 6 a+=1; 7 } 8 9 int main()10 {11 int a=10;12 thread t(hello,a);13 t.join();14 cout<
<

解决方法:用std::ref来包装引用类型的参数

#incldue
2 #include
3 using namespace std; 4 void hello(int &a) 5 { 6 a+=1; 7 } 8 9 int main()10 {11 int a=10;12 thread t(hello,ref(a));13 t.join();14 cout<
<

 

转载于:https://www.cnblogs.com/mrlsx/p/5512222.html

你可能感兴趣的文章
深入分析面向对象中的封装作用
查看>>
深刻理解Python中的元类(metaclass)
查看>>
Android View体系(六)从源码解析Activity的构成
查看>>
fnmatch源码阅读
查看>>
U9249 【模板】BSGS
查看>>
Node.js+Koa开发微信公众号个人笔记(一)准备工作
查看>>
Android 图片缓存处理
查看>>
阿里盒马领域驱动设计实践
查看>>
vuex 存值 及 取值 的操作
查看>>
如何在C#项目中使用NHibernate
查看>>
安装python包到指定虚拟环境
查看>>
力扣(LeetCode)21
查看>>
网页视频流m3u8/ts视频下载
查看>>
Python 基础起步 (十) 什么叫函数?
查看>>
5G一周热闻:华为夺联通5G大单,首张5G电话卡发放
查看>>
“迁移策略+新容器运行时”应对有状态应用的冷热迁移挑战
查看>>
使用Swoole加速Laravel(正式环境中)
查看>>
mockjs让前端开发独立于后端
查看>>
1.4linux单用户模式下修改root密码和救援模式修改root密码
查看>>
微服务架构优缺点
查看>>