线程创建、join、detach

线程的创建

进程的生命周期是和主线程相同的。进程的开启伴随着主线程的出现,主线程执行完毕代表着进程的结束。在编译器上,主线程是从main函数开始,当主线程从main函数上返回,就代表着进程的结束。一般情况下,如果主线程执行结束,也就是进程结束时还有其他线程未执行完毕,也会被强制终止。所以,对于自主创建的线程要确保其在主线程结束执行前执行完毕或者保持主线程,否则就可能达不到预期的效果。

#include<iostream>
#include<thread>
using namespace std;
void nowork()//线程入口
{cout<<"nowork线程"<<endl; 
}int main()
{thread newdozer(nowork);if(newdozer.joinable())//判断线程是否可以join或detach{newdozer.join();//使用join阻塞主线程直到新线程执行完毕}else{cout<<"失败"<<endl;}
}

创建线程需要使用include<thread>将头文件包含进来。与main函数相似,自定义的函数也可以作为新创建线程的通路。然后创建thread对象,并使用自定义的函数作为进程入口进行初始化。这样一条新线程就创建出来了。当代码执行此段后,就会自动通过线程入口启动新线程。为了保证新线程执行情况,还要使用thread成员中的join或者detach确保新线程执行的完全。join的作用是阻塞主线程的执行直到新线程执行完毕,就是让主线程等一等新线程。detach的作用是将线程从进程中分离出,转而在后台运行,这样即使主线程运行完毕,新线程也不会停止运行。但是一个线程被detach处理后就无法再与其进行同步或其他形式的交互了,会失去对该线程的控制。joinable可以用来判断是否可以进行join或者detach操作,可以返回true,不行返回false。

其他创建线程的方法

使用类对象创建线程

#include<iostream>
#include<thread>
using namespace std;
class A
{
public:int &m_i;
public:A(int &a):m_i(a) {}operator()(){cout<<m_i<<endl;cout<<"新线程"<<endl;}
};int main()
{A ta;thread newdozer(ta);newdozer.join();
}

使用类创建新线程,需要先创建类对象,再用类对象初始化thread对象。这样新线程会复制一个类对象作为新线程的入口。如果类对象的成员中包含主线程中的变量的引用、指针等,就不要使用detach确保线程的执行。因为如果主线程先被执行完毕销毁的话,那么新线程使用这些成员就访问了已被释放的内存,从而偏离设想。

使用lambda表达式

#include<iosteam>
#include<thread>
using namespace std;
int main()
{auto lambthread [](){cout<<"新线程"<<endl;}thread newdozer(lambthread);newdozer.join();   
}

使用类成员函数

#include<iosream>
#include<thread>
using namespace std;
class A
{
public:void nowork(int a){cout<<"新线程"<<endl;}
};
int main()
{A obj;thread newdozer(&A::nowork,obj,666);newdozer.join();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4种常⽤Java线程锁的特点,

1 提供了多种多线程锁机制的实现⽅式 synchronizedReentrantLockSemaphoreAtomicInteger

【LeetCode刷题记录】124. 二叉树中的最大路径和

124 二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的…

【Java开发的我出书啦,各位同仁快过来围观】!!!

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容出书的目的出书的过程书籍的内容 &#x1f4e5;博主的话 &#x1f50a;博主介绍 文章目录 &#x1f50a;博主介绍&#x1f964;本文内容出书的目的出书的过程书籍的内容 &#x1f4e5;博主的话 &#x1f33e;阅读前&#x…

linux系统的备份管理

centos7系统备份与还原 1、系统备份 下面是我用来备份系统的完整命令&#xff1a; # cd /# tar -zcvpf centos7.tgz --exclude/proc --exclude/lostfound --exclude/mnt --exclude/sys --excludecentos7.tgz / “tar”当然就是我们备份系统所使用的程序了。 “cvpfz”是tar的选…

「网络流 24 题」太空飞行计划 【最大权值闭合图】

「网络流 24 题」太空飞行计划 题意 有 n n n 个实验 和 m m m 个器械&#xff0c;每个实验都需要若干个指定的器械才能进行 实验 i i i 的盈利为 p i p_i pi​&#xff0c; 器械 j j j 的花销为 c j c_j cj​ 找出纯利润最大的实验计划 思路 这是非常典型的最大权值…

如何定时关闭程序

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 前面的流程步骤参考这条攻略&#xff1a; 快捷自由定时重启、注销、关机 只不过最后的地方&#xff0c;选择 关闭程序 &#xff0c;再填写程序名称即可 补…

2024-03-23青少年软件编程(Python语言)等考(四级)解析

2024-03-23青少年软件编程(Python语言)等考(四级)解析一、单选题(共25题,共50分) 1.运行如下代码,若输入整数3,则最终输出的结果为?( C ) def f(x):if x==1:s=1else:s=f(x-1)*xreturn s n=int(input("请输入一个大于1的整数:")) print(f(n)+f(n-1)) A.2…

全栈开发之路——前端篇(5)组件间通讯和接口等知识补充

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 辅助文档&…

Linux中的软连接和硬链接

一、软和硬链接连接 在Linux系统中&#xff0c;软连接&#xff08;符号链接&#xff09;和硬链接是文件系统中两种不同类型的链接&#xff0c;它们用于创建对文件的引用。下面详细解释这两种链接的特点和区别&#xff1a;、 软连接&#xff08;符号链接&#xff09; 定义&…

项目中遇到的问题

web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成&#xff0c;举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页&#xff0c;现在在toTrade请求中使用异步任务编排Completab…

鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证

文章目录 系列文章背景认证考试题库参考注意:题库会不定时的进行具备调整甚至整体轮换,此为2024.5月版本注意:题库中题目的选项每次都会随机顺序,请参考内容判断题单选题多选题系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环…

Windows运维_Win10自带图片查看器不见了在哪里打开

Windows运维_Win10自带图片查看器不见了在哪里打开 Windows 10 系统自带的图片查看器可以帮助我们快速查看电脑的图片&#xff0c;十分方便。 但是有不少用户发现自己 Win10 系统自带的图片查看器功能不见了&#xff0c;导致图片只能在画图或者其他工具里打开&#xff0c;极其…

西红柿叶病害检测(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.基于最新的YOLOv8训练的西红柿病害检测模型&#xff0c;和基于PyQt5制作的可视西红柿病害系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检Bacterial Spot, Early_Blight, Healthy, Late_blight, Leaf Mold, Target_Spot, black spot&#xff0c…

电商风口的最后一班快车?有些人甚至正在All in视频号!

我是王路飞。 当抖音、快手、淘宝上的商家还在内卷的时候&#xff0c;有些人却转移了阵地&#xff0c;搭上了电商风口的“最后一般列车”&#xff0c;甚至正在All in 视频号。 内容来源于【醒醒团队-电商王路飞】 随着“微视”想要三分天下野心的失败&#xff08;与抖音、快手…

SD-WAN:企业低成本与高性能组网的理想选择

在竞争日益激烈的市场中&#xff0c;企业要立足就需要一种既能控制成本又能保证卓越性能的网络解决方案。尽管传统组网方式稳定可靠&#xff0c;但其高昂的硬件投入和升级成本让许多企业望而却步&#xff0c;而SD-WAN为企业提供了一个理想的解决方案。 成本效益&#xff1a;精打…

[Kubernetes] KubeKey 部署 K8s v1.28.8

文章目录 1.K8s 部署方式2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.K8s 部署方式 kubeadm: kubekey, sealos, kubespray二进制: kubeaszrancher 2.操作系统基础配置 主机名内网IP外网IPmaster192.168.66.2139.198.9.7node1192.168.66.3139.198.40.17…

创建一个线程对象需要花费多少内存空间

创建一个std::thread对象所需的内存空间大小并不是固定的&#xff0c;因为它取决于多种因素&#xff0c;包括C运行时库的实现、编译器优化、以及可能的平台和架构差异。 std::thread对象本身是一个轻量级的控制块&#xff0c;它主要用于管理线程的执行&#xff0c;包括保存线程…

<iomanip>库中setw(),setfill()等函数的使用

#include <iomanip> #include<iomanip>是C标准库中的一个头文件&#xff0c;提供了用于输入/输出格式控制的函数和类。它特别适用于调整输出的对齐、填充、精度等格式。 setw() stew&#xff0c;这是一个用于操纵输出格式的函数&#xff0c;用于美化C程序的输出…

FreeBSD进入单用户模式拯救崩溃的系统

在FreeBSD系统里总归会遇到手残把系统弄崩的情况&#xff0c;即默认的多用户模式进不去或系统压根就启动到一半办错&#xff0c;或者进入调试模式&#xff0c;这时候可以进单用户模式拯救系统&#xff0c;一般都能救回来。 FreeBSD系统启动后进入单用户模式&#xff0c;先执行 …