关于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`线程传参的思考的更多相关文章

  1. c++11中关于std::thread的join的思考

    c++中关于std::thread的join的思考 std::thread是c++11新引入的线程标准库,通过其可以方便的编写与平台无关的多线程程序,虽然对比针对平台来定制化多线程库会使性能达到最大, ...

  2. std::thread函数传参拷贝次数

    c++11的thread库大大方便了开发,但是目前网络上少有深入分析的资料和使用例程.特别是在线程函数传参这一块,一般止步于使用std::ref传引用. 这次写服务器遇到个BUG,线程函数参数是智能指 ...

  3. 第24课 std::thread线程类及传参问题

    一. std::thread类 (一)thread类摘要及分析 class thread { // class for observing and managing threads public: c ...

  4. C++11 并发指南------std::thread 详解

    参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...

  5. C++11并发之std::thread<转>

    最近技术上没什么大的收获,也是悲催的路过~ 搞一点新东西压压惊吧! C++11并发之std::thread 知识链接: C++11 并发之std::mutex C++11 并发之std::atomic ...

  6. std::thread线程库详解(2)

    目录 目录 简介 最基本的锁 std::mutex 使用 方法和属性 递归锁 std::recursive_mutex 共享锁 std::shared_mutex (C++17) 带超时的锁 总结 简 ...

  7. C++11中的std::bind

    C++11中的std::bind 最近在看看cocos2dx的源代码,发现了cocos2dx 3.0相对于2.0改动了很多,最大的改变就是大量的使用了C++11的特性,比如auto等.其中有一个关于回 ...

  8. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  9. java 线程传参 方式

    第一类:主动向线程传参   public class ThreadTest extends Thread { public ThreadTest() { } /** * 第一种通过构造方法来传递参数 ...

随机推荐

  1. 10 个你需要了解的 Linux 网络和监控命令

    我下面列出来的10个基础的每个linux用户都应该知道的网络和监控命令.网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nsloo ...

  2. android样式相关

    转载自Keegan小钢,原文链接http://keeganlee.me/post/android/20150830

  3. ShopNc登录验证码

  4. linux信号基本概念及如何产生信号

    linux信号基本概念及如何产生信号 摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:34:21 阅读 ...

  5. oracle数据库创建表

    实际工作中,在数据库中创建表是经常会用到的.我们今天呢?主要给大家来分享一下在数据库如何通过sql语句去创建表.其实,创建表很简单,只需要把数据库的数据类型和约束搞清楚就可以了,其他的就好说了.接下来 ...

  6. LightOJ 1258 Making Huge Palindromes (Manacher)

    题意:给定上一个串,让你在后面添加一些字符,使得这个串成为一个回文串. 析:先用manacher算法进行处理如果发现有字符匹配超过最长的了,结束匹配,答案就是该字符前面那个长度加上该串原来的长度. 代 ...

  7. Vivado生成edf文件

    https://china.xilinx.com/support/answers/54074.html  综合完成后会跳出个框框,选择open synthesis write_edif module. ...

  8. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  9. Entity Framework快速入门--直接修改(简要介绍ObjectContext处理机制)

    在介绍Entity Framework的修改实体到数据库的方法之前呢,我们先简要的介绍一下ObjectContext的处理机制. 1.ObjectContext的处理机制 ObjectContext是 ...

  10. 状态压缩DP----HDU2809

    状态压缩DP的一道较不错的入门题,第二次做这类问题,感觉不是很顺手,故记录下来. 题目的意思就是吕布战群雄,先给你6个数,分别是吕布的攻击值,防御值,生命值,升级后此三值各自的增量,然后是对手的个数n ...