线程传参、线程ID

server/2024/9/23 11:14:55/

传递临时对象作线程参数

#include<ioatream>
#include<thread>
using namespace std;
void nowork(const int& a)
{cout<<huyanluanyu<<endl;
}
int main()
{int a=677;thread newdozer(nowork,a);newdozer.detach();
}

向新创建的线程中传递参数并不复杂,仅需在初始化thread对象时传递线程入口的后面加上传递的参数列表。这种参数的传递,实际上是在新线程中复制一份相同的数据,即使参数设置为了引用,但实际上仅是复制了内容,主线程引用对象的销毁并不会对新线程产生影响。这样防止了使用detach操作后主线程比新线程先释放内存对新线程的影响。这也是指针是不可以被传递到新线程的原因。

使用detach还有一种情况,如果传递的实参类型和形参不符,可以的情况下,编译器会进行隐式的类型转换。这种类型转换实际上发生在新线程中。这样会产生一个问题,在这种隐式的类型转换发生之前主线程已经执行完毕释放了实参的内存。为了避免这种情况,需要将实参转换为与形参类型相同临时对象,再用原实参初始化该临时对象。这样传递类型相吻合,就避免了使用释放过的对象。

线程ID

线程ID(Thread ID,简称TID)是操作系统分配给线程的唯一标识符,用于标识和区分不同的线程。线程ID在程序执行和调试过程中起着重要作用,特别是在多线程程序中,可以帮助开发者跟踪和管理线程的执行情况。

在C++中,开发者可以使用操作系统提供的API函数来获取当前线程的ID。线程ID通常是一个整数,用于标识不同的线程。这个ID是由操作系统内核分配的,并且在线程的生命周期内是唯一的,不会被其他线程使用。

线程ID实际上是一个数字。可以使用C++标准库中的std::this_thread_get_id()函数来获取。

传递引用、智能指针作线程参数

如果需要将一个对象作为参数传递给线程函数,并且希望线程函数能够直接修改这个对象时,可以通过std::ref()处理传递对象。由于线程函数通常接受参数的复制版本(除非特别指定为引用),因此直接传递对象会导致线程函数操作的是对象的副本,而不是原始对象。使用 `std::ref()` 可以帮助确保线程函数操作的是原始对象的引用。

传递智能指针智能指针作线程参数时,如果传递的是unique_ptr,那么应该使用移动语义std::move(),移动后,原始的unique_ptr对象将变为空指针,线程函数将拥有该指针的所有权。而shared_ptr可以直接传递。多个线程可以共享对同一动态分配内存的访问权。

注意:传递引用、智能指针作线程参数时,要保证关联内存的生命周期,避免使用detach()。


http://www.ppmy.cn/server/38173.html

相关文章

DI-engine强化学习入门(九)环境包裹器(Env Wrapper)

在强化学习中&#xff0c;环境&#xff08;Environment&#xff09;是智能体&#xff08;Agent&#xff09;进行学习和互动的场所&#xff0c;它定义了状态空间、动作空间以及奖励机制。Env Wrapper&#xff08;环境包装器&#xff09;提供了一种方便的机制来增强或修改原始环境…

微信小程序开发,构建NPM报错解决

报错信息如下&#xff1a; message&#xff1a; NPM packages not found. Please confirm npm packages which need to build are belong to miniprogramRoot directory. Or you may edit project.config.jsons packNpmManually and packNpmRelationList appid: wx7144a5d5411…

LINUX 入门 5.1

LINUX 入门 5.1 day8 20240503 课程链接地址 第5章 数据库mysql项目实战 mysql基础 第四节&#xff1a; mysql_init(&mysql) NULL失败 mysql_real_connect(&mysql, KING_DB_SERVER_IP, KING_DB_USERNAME, KING_DB_PASSWORD, KING_DB_DEFAULTDB, KING_DB_SERVER_PO…

Linux的基础IO:软硬连接 动态库 静态库

目录 软硬连接 硬链接的作用 静态库 制作静态库 安装自定义静态库 动态库 制作动态库 协助OS查找动态库的五种方法 总结 动态库加载 软硬连接 创建硬链接指令&#xff1a;ln 目标文件 链接者 创建软链接指令&#xff1a;ln -s 目标文件 链接者 删除链接指令&…

gin自定义中间件

gin自定义中间件 代码 代码 package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time" )// MyLogger 自定义中间件&#xff1a;方式二&#xff1a;通过定义函数&#xff0c;返回gin.HandlerFunc类型的函数&#xff0c;定…

监控工具对比分析报告:Zabbix与Prometheus

引言 在现代IT运营中&#xff0c;监控系统发挥着至关重要的作用&#xff0c;它们帮助组织监控和管理其技术基础设施和应用程序的性能和健康状况。本报告将对比分析两种流行的监控工具——Zabbix和Prometheus&#xff0c;这两个工具虽都广泛用于IT基础设施的监控&#xff0c;但…

母婴用品网站设计与实现 java母婴用品网站源代码+论文+ppt

母婴用品网站设计与实现:基于JSP与MySQL的实践探索 引言 随着信息化时代的到来,母婴用品网站作为信息获取和商品交易的平台,其开发与设计成为了一个迫切的课题。本文将探讨如何利用JSP技术和MySQL数据库构建一个功能完备、用户友好的母婴用品网站。 系统概述 背景与必要…

用户管理中心——数据库设计用户注册逻辑设计

用户管理中心——数据库设计&用户注册逻辑设计 规整项目目录1. 数据库自动生成器的使用实现基本的数据库操作&#xff08;操作user表&#xff09; 2. 注册逻辑的设计(1) 写注册逻辑(2) 实现(3) 测试代码 3. 遇到的问题 规整项目目录 utils–存放工具类&#xff0c;比如加密…