std::thread的常用参数传递总结
实参的生命周期
给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的常用参数传递总结相关推荐
- c++11仔细地将参数传递给线程std::thread
要将参数传递给线程的可关联对象或函数,只需将参数传递给std::thread构造函数. 默认情况下,所有的参数都将复制到新线程的内部存储中. 看一个例子: 给线程传递单个参数 #include < ...
- Thread函数的参数传递和线程所有权转移(2.2)--std::move()
(1)先上代码: void f(int i,std::string const & s); std::thread t(f,"hello"); 第一个参数是线程函数名,第二 ...
- C++11学习笔记-----线程库std::thread
在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...
- [C++11 std::thread] 使用C++11 编写 Linux 多线程程序
From: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/index.html 本文讲述了如何使用 C++11 编写 Lin ...
- C++11 多线程(std::thread)详解
注:此教程以 Visual Studio 2019 Version 16.10.3 (MSVC 19.29.30038.1) 为标准,大多数内容参照cplusplus.com里的解释 此文章允许转载, ...
- C++11 新特性之std::thread
C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...
- std thread
不要用std::thread写裸线程 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/daan_112211/article/details/1908 ...
- 并发,std::thread
2019独角兽企业重金招聘Python工程师标准>>> std::thread 定义一个线程对象,并管理关联的线程 备注: 你可以使用 thread 对象来观察和管理在应用程序中的 ...
- 【多线程】C++11进行多线程开发 (std::thread)
文章目录 创建线程 std::thread 类 使用join() 使用 detach() 警惕作用域 线程不能复制 给线程传参 传递指针 传递引用 以类成员函数为线程函数 以容器存放线程对象 互斥量 ...
- std:: string 的常用使用
std string 的常用使用 用 string来代替char * 数组,使用sort排序算法来排序,用unique 函数来去重1.Define string s1 = "hello&qu ...
最新文章
- linux系统回收站功能的实现
- 向量空间模型(Vector Space Model)的理解
- 第五章 MongoDb索引优化 5.4
- WebSockets 简介
- 线性代数:二次型为什么可以用矩阵表示?——分组因式分解推导
- 僵尸进程和孤儿进程 转载
- Codeforces Round #359 div2
- 德勤发布2021年度企业AI应用现状报告,AI驱动已成竞争必需品
- MixedRealityToolkit-Unity:MR应用必用神器
- tomcat7.0支持什么版本的jdk_JDK/Java 16 可能带来什么新特性?
- [嵌入式]Ubuntu下mini2440的环境搭建-截图记录-转
- ASP.NET 文件后缀名详解
- JavaWeb学习心得之自定义传统标签
- vyos -vyatta-config-commit save
- MOEA/D的通俗解析--1.MOEA
- 5gh掌上云计算认证不通过_华为云计算认证考试好考吗?我考华为云计算HCIE的经验分享...
- 线性回归:异方差检测及其处理方法
- 【参赛作品71】CentOS 7.9 安装 openGauss 2.1.0 之剥茧抽丝
- 微信小游戏之飞机大战解析
- 智慧工地给工地装上“最强大脑”
热门文章
- samba服务器之无认证进入共享目录
- Python之路-4
- 使用jQuery+huandlebars遍历中if判断
- accp8.0转换教材第4章MySQL高级查询(二)理解与练习
- ArcGIS API for JS geodesicUtils.geodesicAreas 计算面积出现负值情况记录
- 東京タワー初めてphoto
- Android客户端和服务器端数据交互的第一种方法
- html画圣诞树—动态效果展示【炫酷合集 免费获取源码】
- matlab myupdatefcn,MATLAB笔记
- 电脑怎么开护眼模式_心累!整天对着手机电脑,到底该怎么护眼啊啊啊