c++11中关于`std::thread`线程传参的思考
关于std::thread
线程传参的思考
最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型、还是引用类型。
对于传递参数是引用类型,需要注意:
1.当指向动态变量的指针
(char *)
作为实数,string const&
作为形参,在传递的时候先人为增加动态变量转换string
的操作。
原因:std::thread
传递参数是直接拷贝一份实参到线程独立内存的,所以假如不事先转换为string
,在创建线程传递参数到std::thread
构造函数后会发生隐性参数转换,但是这时类型转换操作可能会发生错误,如果发生oops,那么std::thread
又只是拷贝实参的一份到自己独立内存,那么自己操作的只是一个“半成品”对象,对原来的动态变量的指针指向的字面常量没有丝毫影响。
解决办法:在传递到std::thread
构造函数前就将字面值转换为std::string
对象。(std::thread t(func, std::string("hello")))
2.期望传递一个引用,在新线程修改引用对象时,需要使用
std::ref()
修饰实参。
原因:std::thread
构造时传参传的只是实参的一份拷贝,拷贝,拷贝,不会像普通函数传参那样,函数形参是引用类型,实参是原型变量,此时调用到函数时函数会获取到对应变量的引用,修改形参引用的变量可以真正修改实参的值。std::thread
传递的只是一份拷贝,传递过去一个变量值,线程形参引用的只是这个变量的拷贝的引用,对它的操作于实参没有任何影响。
解决办法:std::thread
形参是引用时,在std::thread t()
创建线程的时候,需要使用std::ref()
转换参数为引用,那么线程函数获取到的就是对应变量的真正引用,对它的操作就能影响真正的实参。(void func(string& data) std::thread t(func, std::ref(data)))
3.如果想对一个对象,只通过传参来被新线程使用,即把对象的使用权转移给新线程内部变量,被转移对象在主线程就被销毁,达到全局对象唯一性。
解决办法:使用`std::move()修饰参数,可实现所有权转移。
c++11中关于`std::thread`线程传参的思考的更多相关文章
- c++11中关于std::thread的join的思考
c++中关于std::thread的join的思考 std::thread是c++11新引入的线程标准库,通过其可以方便的编写与平台无关的多线程程序,虽然对比针对平台来定制化多线程库会使性能达到最大, ...
- std::thread函数传参拷贝次数
c++11的thread库大大方便了开发,但是目前网络上少有深入分析的资料和使用例程.特别是在线程函数传参这一块,一般止步于使用std::ref传引用. 这次写服务器遇到个BUG,线程函数参数是智能指 ...
- 第24课 std::thread线程类及传参问题
一. std::thread类 (一)thread类摘要及分析 class thread { // class for observing and managing threads public: c ...
- C++11 并发指南------std::thread 详解
参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...
- C++11并发之std::thread<转>
最近技术上没什么大的收获,也是悲催的路过~ 搞一点新东西压压惊吧! C++11并发之std::thread 知识链接: C++11 并发之std::mutex C++11 并发之std::atomic ...
- std::thread线程库详解(2)
目录 目录 简介 最基本的锁 std::mutex 使用 方法和属性 递归锁 std::recursive_mutex 共享锁 std::shared_mutex (C++17) 带超时的锁 总结 简 ...
- C++11中的std::bind
C++11中的std::bind 最近在看看cocos2dx的源代码,发现了cocos2dx 3.0相对于2.0改动了很多,最大的改变就是大量的使用了C++11的特性,比如auto等.其中有一个关于回 ...
- C#基础知识回顾--线程传参
C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...
- java 线程传参 方式
第一类:主动向线程传参 public class ThreadTest extends Thread { public ThreadTest() { } /** * 第一种通过构造方法来传递参数 ...
随机推荐
- ubuntu安装Docky 3.0
添加PPA并在命令行安装,执行以下命令: sudo add-apt-repository ppa:ricotz/docky sudo apt-get update sudo apt-get insta ...
- linux之sort用法
sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内容,以行为单位来排序. 参 数 ...
- jquery on事件在IE8下失效的一种情况,及解决方法/bootstrap空间绑定控件事件不好用
同事在复制bootstrap中的select控件之后,发现用$('.selectpicker').selectpicker();刷新下拉框控件不好使,后来发现是用原生js克隆的方法obj.cloneN ...
- 468C Hack it!
传送门 题目大意 分析 here 对于最后求p的过程我想再说一下 那个45就是最前一位分别是0~9,所以总贡献就是45乘上每一种数开头对应多少种情况 而后面的10则是他前面可以填多少不同的数对他做的贡 ...
- GridView删除行
在GridView绑定数据的时候需要设置该GridView的主键值,设置的这个主键与取出来的数据的一个字段对应.比如,取出来的数据表中有个ID的字段,那设这个ID为该GridView的主键是比较好的. ...
- HUSTSE2017级5班3组小组JIRA软件使用体验看法汇总--未订正版
小组JIRA软件使用体验看法汇总 小黄 JIRA还是比较方便的,在项目组合管理阶段,可以让团队同时按时发布,也可以让计划变得更容易和快捷,可以跟踪团队的重要计划,清楚的了解项目的进度. 看了JIRA的 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解
一.关键字说明: oop:面向对象 aop:面向切面 ioc:控制反转 orm:对象关系映射 pojo:数据库表映射的java实体类 二.常识说明:1.hibernate和mybatis都属于持久层. ...
- 使用Boost库(1)
如何说服你的公司.组织使用Boost库 one of the most highly regarded and expertly designed C++ library projects in th ...
- 文字相对于 div 垂直居中
通用方法 height 跟line-height div{ border: 1px solid black; text-align: left; height: 200px; line-height ...
- asp.net微信内置浏览器下Session失效
问题记录:仅限安卓端微信内置浏览器,服务器集群设置了黏性Session,在Post请求时会强制走代理,导致出去的ip指向另一台服务器,黏性Session失效,用户状态无法保存. 目前想知道除了设置Se ...