关于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() { } /** * 第一种通过构造方法来传递参数 ...
随机推荐
-
MySQL密码忘记,怎么办?
如果哪天你忘记了线上MySQL数据库的root密码,怎么办? 大家往往会想到skip-grant-tables参数,具体步骤如下: 1. 关闭MySQL数据库,因为root密码忘记了,mysqladm ...
-
这世上倒底有没有神仙——说“Excel不是数据库,是不是犯了白马非马论的错误??
这问题是这样引出来的: 我上计算机应用基础课,讲到Excel,因为一直以来,很多新生对Word中的表格和Excel中的表格总是分不清,甚至有老师也问过我,Excel中的表格和Word中的表格有什么区别 ...
-
PSP进度(11~16)
本周psp 11月14号 内容 开始时间 结束时间 打断时间 净时间 查看Java相关资料 18:31 19:28 0 57分 代码实现 19:30 20:46 0 76分 发布博客 22:55 23 ...
-
linux与linux,linux与windows之间用SSH传输文件
linux与linux,linux与windows之间用SSH传输文件linux与linux之间传送文件:scp file username@hostIP:文件地址 例: scp abc.txt ...
-
在指定路径下查找并打印mdb类型文件
1 #encoding:utf8 import os fpath = 'D:\Download\LP传奇-麒麟传说\Date' rfile = '' files = [] mdbFiles = [] ...
-
动态引入Js文件
var src = "/Scripts/Test.js"; $("<script type = 'text/javascript' src='" + sr ...
-
12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...
-
Maven, IntellJ Idea 配置注意点
1. Maven要自己安装一个: 2. Maven设置中,settings.xml和repository地址都配置成自己: 3. Enable Auto import 4. 找不到jar文件时,自己的 ...
-
ibatis->;mybatis升级过程
最终目录结构 resources spring applicationContext.xml sqlmap mapper aaamapper.xml bbbmapper.xml mybatis-con ...
-
(53)Wangdao.com第七天_JavaScript 强制类型转换
其他进制的数字 二进制 以 0b 开头的 Number 八进制 以 0 开头的 Number 十六进制 以 0x 开头的 Number 注意:无论是多少进制的数字,输出都是十进制 强 ...