实参的生命周期

给std::thread传递参数的时候要注意,参数是引用或者指针的情况下,要注意生命周期的问题

#include <iostream>
#include <thread>
#include <chrono>
#include <fstream>
using namespace std::chrono_literals;
void func_str(const std::string & str)
{std::this_thread::sleep_for(2s);std::cout << "ThreadArg data is  " << str << '\n';
}
void start_thread(void)
{char buffer[6] = {'a','b','c','d','e','\0'};std::thread t(func_str, std::string(buffer));// 可以测试 std::thread t(func_str, buffer); //crasht.detach();
}
int main(int argc, char** argv)
{std::thread t1(start_thread);t1.join();std::this_thread::sleep_for(3s); // 3s是字面量 since C++14  可以用 std::chrono::seconds(3)替代return 0;
}

我们考虑变量生命周期的问题,尤其是线程是分离的情况下,给予线程参数的线程有可能提前退出而释放资源,导致持有参数对象的线程访问了已经销毁的资源,尤其是对于局部变量。

上边的代码是为了保证线程 t 对资源的访问是独立的,所以用一个join线程t1来启动线程t,  为了观察到t线程的行为,所以又让主线程main,sleep一段时间,否则程序因为进程的结束,而回收线程资源

参数是引用类型
要使用std::ref

#include <iostream>
#include <thread>
#include <chrono>
#include <fstream>
using namespace std::chrono_literals;
class ThreadArg
{public:ThreadArg():data(123456){std::cout<<"constructor"<<std::endl;}ThreadArg(const ThreadArg & rhs):data(rhs.data){std::cout<<"copy constructor"<<std::endl;}~ThreadArg(){std::cout<<"destructor"<<std::endl;}void setData(int value){this->data = value;}void printData(int num){std::cout << "ThreadArg data is  " << data <<"  "<<num<<'\n';}private:int data;
}; void func(ThreadArg & arg)
{arg.setData(1000);
}
int main(int argc, char** argv)
{ThreadArg arg;std::thread t1(func,std::ref(arg)); //不加引用可能编译失败t1.join(); // 需要在thread对象销毁之前决定线程是 join 还是deatch ,否则程序会异常终止arg.printData(100);                                                                                                                                                                                                             return 0;
}

传递一个类成员函数

int main(int argc, char** argv)
{ThreadArg  arg;std::thread t(&ThreadArg::printData, &arg,100);t.join();                                                                                                                                                                                                  return 0;
}

参数是unique_ptr

void func_ptr(std::unique_ptr<ThreadArg> ptr)
{ptr->setData(1000);
}
int main(int argc, char** argv)
{std::unique_ptr<ThreadArg> ptr{new ThreadArg};std::thread t(func_ptr, std::move(ptr));t.join();if (ptr){ptr->printData(100);}return 0;
}

可以参考https://blog.csdn.net/veghlreywg/article/details/86529678 了解unique_ptr的使用

std::thread的常用参数传递总结相关推荐

  1. c++11仔细地将参数传递给线程std::thread

    要将参数传递给线程的可关联对象或函数,只需将参数传递给std::thread构造函数. 默认情况下,所有的参数都将复制到新线程的内部存储中. 看一个例子: 给线程传递单个参数 #include < ...

  2. Thread函数的参数传递和线程所有权转移(2.2)--std::move()

    (1)先上代码: void f(int i,std::string const & s); std::thread t(f,"hello"); 第一个参数是线程函数名,第二 ...

  3. C++11学习笔记-----线程库std::thread

    在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...

  4. [C++11 std::thread] 使用C++11 编写 Linux 多线程程序

    From: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/index.html 本文讲述了如何使用 C++11 编写 Lin ...

  5. C++11 多线程(std::thread)详解

    注:此教程以 Visual Studio 2019 Version 16.10.3 (MSVC 19.29.30038.1) 为标准,大多数内容参照cplusplus.com里的解释 此文章允许转载, ...

  6. C++11 新特性之std::thread

    C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...

  7. std thread

    不要用std::thread写裸线程 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/daan_112211/article/details/1908 ...

  8. 并发,std::thread

    2019独角兽企业重金招聘Python工程师标准>>> std::thread  定义一个线程对象,并管理关联的线程 备注: 你可以使用 thread 对象来观察和管理在应用程序中的 ...

  9. 【多线程】C++11进行多线程开发 (std::thread)

    文章目录 创建线程 std::thread 类 使用join() 使用 detach() 警惕作用域 线程不能复制 给线程传参 传递指针 传递引用 以类成员函数为线程函数 以容器存放线程对象 互斥量 ...

  10. std:: string 的常用使用

    std string 的常用使用 用 string来代替char * 数组,使用sort排序算法来排序,用unique 函数来去重1.Define string s1 = "hello&qu ...

最新文章

  1. linux系统回收站功能的实现
  2. 向量空间模型(Vector Space Model)的理解
  3. 第五章 MongoDb索引优化 5.4
  4. WebSockets 简介
  5. 线性代数:二次型为什么可以用矩阵表示?——分组因式分解推导
  6. 僵尸进程和孤儿进程 转载
  7. Codeforces Round #359 div2
  8. 德勤发布2021年度企业AI应用现状报告,AI驱动已成竞争必需品
  9. MixedRealityToolkit-Unity:MR应用必用神器
  10. tomcat7.0支持什么版本的jdk_JDK/Java 16 可能带来什么新特性?
  11. [嵌入式]Ubuntu下mini2440的环境搭建-截图记录-转
  12. ASP.NET 文件后缀名详解
  13. JavaWeb学习心得之自定义传统标签
  14. vyos -vyatta-config-commit save
  15. MOEA/D的通俗解析--1.MOEA
  16. 5gh掌上云计算认证不通过_华为云计算认证考试好考吗?我考华为云计算HCIE的经验分享...
  17. 线性回归:异方差检测及其处理方法
  18. 【参赛作品71】CentOS 7.9 安装 openGauss 2.1.0 之剥茧抽丝
  19. 微信小游戏之飞机大战解析
  20. 智慧工地给工地装上“最强大脑”

热门文章

  1. samba服务器之无认证进入共享目录
  2. Python之路-4
  3. 使用jQuery+huandlebars遍历中if判断
  4. accp8.0转换教材第4章MySQL高级查询(二)理解与练习
  5. ArcGIS API for JS geodesicUtils.geodesicAreas 计算面积出现负值情况记录
  6. 東京タワー初めてphoto
  7. Android客户端和服务器端数据交互的第一种方法
  8. html画圣诞树—动态效果展示【炫酷合集 免费获取源码】
  9. matlab myupdatefcn,MATLAB笔记
  10. 电脑怎么开护眼模式_心累!整天对着手机电脑,到底该怎么护眼啊啊啊