C++11并发与多线程笔记(2)线程启动、结束,创建线程多法、join,detach

news2025/3/10 5:42:38

C++11并发与多线程笔记(2) 线程启动、结束,创建线程多法、join,detach

  • 1. 范例演示线程运行的开始
    • 1.1 创建一个线程:
    • 1.2 join
    • 1.3 datch
    • 1.4 joinable
  • 2. 其他创建线程的方法
    • 2.1 用类 重载了函数调用运算符
    • 2.2 lambda表达式创建线程

1. 范例演示线程运行的开始

  • 程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕
  • 主线程从**main()开始执行,**那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行
  • 整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释】

1.1 创建一个线程:

  1. 包含头文件thread
  2. 写初始函数
  3. 在main中创建thread
    必须要明白:有两个线程在跑,相当于整个程序中有两条线在同时走,即使一条被阻塞,另一条也能运行
#include <iostream>
#include <thread>
using namespace std;

void myPrint()
{
	cout << "我的线程开始运行" << endl;
	//-------------
	//-------------
	cout << "我的线程运行完毕" << endl;
	return;
}

int main()
{
	//(1)创建了线程,线程执行起点(入口)是myPrint;(2)执行线程
	thread myThread(myPrint);

	//(2)阻塞主线程并等待myPrint执行完,当myPrint执行完毕,join()就执行完毕,主线程继续往下执行
	//join意为汇合,子线程和主线程回合
	myThread.join();

	//设置断点可看到主线程等待子线程的过程
	//F11逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面
	//F10逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行

	//(3)传统多线程程序中,主线程要等待子线程执行完毕,然后自己才能向下执行
	//detach:分离,主线程不再与子线程汇合,不再等待子线程
	//detach后,子线程和主线程失去关联,驻留在后台,由C++运行时库接管
	//myThread.detach();

	//(4)joinable()判断是否可以成功使用join()或者detach()
	//如果返回true,证明可以调用join()或者detach()
	//如果返回false,证明调用过join()或者detach(),join()和detach()都不能再调用了
	if (myThread.joinable())
	{
		cout << "可以调用可以调用join()或者detach()" << endl;
	}
	else
	{
		cout << "不能调用可以调用join()或者detach()" << endl;
	}
	
	cout << "Hello World!" << endl;
	return 0;
}

1.2 join

join意为汇合,子线程和主线程回合

1.3 datch

detach:分离,主线程不再与子线程汇合,不再等待子线程
detach和join只能

1.4 joinable

joinable(): 判断是否可以成功使用join()或者detach()。
如果返回true,证明可以调用join()或者detach()
如果返回false,证明调用过join()或者detach()

重要补充:
线程类参数是一个可调用对象
一组可执行的语句称为可调用对象,c++中的可调用对象可以是函数函数指针lambda表达式bind创建的对象或者重载了函数调用运算符的类对象。

2. 其他创建线程的方法

2.1 用类 重载了函数调用运算符

创建一个类,并编写圆括号重载函数,初始化一个该类的对象,把该对象作为线程入口地址

class Ta
{
public:
	void operator()() //不带参数
	{
		cout << "我的线程开始运行" << endl;
		//-------------
		//-------------
		cout << "我的线程运行完毕" << endl;
	}
};

//main函数里的:
int main(){
	Ta ta;
	thread mytobj1(ta);//子进程mytobj1从ta开始执行
	mytobj1.join(); //等待子进程执行结束
	cout<<"I love China"<<endl;
	return 0;
}

问题案例(避免):

class TA{
public:
	int &m_i;//引用
	TA(int &i):m_i(i){}
	void operator() (){//不带参数
	cout<<"m_i1的值为:"<<m_i<<endl;
	cout<<"m_i2的值为:"<<m_i<<endl;
	cout<<"m_i3的值为:"<<m_i<<endl;
	cout<<"m_i4的值为:"<<m_i<<endl;
	cout<<"m_i5的值为:"<<m_i<<endl;
	cout<<"m_i6的值为:"<<m_i<<endl;
	cout<<"m_i7的值为:"<<m_i<<endl;
	cout<<"m_i8的值为:"<<m_i<<endl;
}
int main(){
	int myi=6;
	TA ta(myi);
	thread mytobj2(ta);//ta:可调用对象
	mytobj2.detach();
	
}

结果:

在这里插入图片描述
分析:传入子线程的是引用,使用detach后,主线程提前结束,释放myi,子线程的值就会无效。

  • 一旦调用了detach(),那我主线程执行结束了,我这里用的这个ta这个对象还在吗?〈对象不在)

  • 这个对象实际上是被复制到线程中去(调用拷贝构造函数) ﹔执行完主球程后,ta会被销毁,但是所复制的TA对象依旧存在。

  • 所以,只要你这个TA类对象里没有引用,没有指针,那么就不会产生问题;

2.2 lambda表达式创建线程

int main(){
	auto mylamthrea=[]{
		cout << "我的线程开始运行" << endl;
		//-------------
		//-------------
		cout << "我的线程运行完毕" << endl;
	};
	
	thread myobj4(mylamthrea);
	myobj4.join();
	cout << "Hello World!" << endl;
	return 0;
}

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

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

相关文章

行业常识_Modbus

文章目录 1 Modbus1.1 Modbus是啥1.2 应用1.3 协议变体及区别1.3.1 物理层1.3.2 帧结构1.3.3 传输速率1.3.4 连接方式1.3.5 网络依赖性1.3.5 安全性 1.4 传输方式1.4.1 协议数据单元 1.5 Modbus协议数据模型1.6 Modbus地址模式 1 Modbus 1.1 Modbus是啥 Modbus是一种协议。 其…

AUTOSAR规范与ECU软件开发(实践篇)3.2 ETAS AUTOSAR系统解决方案介绍(上)

1、ETAS AUTOSAR系统解决方案介绍 博世集团ETAS公司基于其强大的研发实力为用户提供了一套高效、 可靠的AUTOSAR系统解决方案&#xff0c; 该方案覆盖了软件架构设计、 应用层模型设计、 基础软件开发、 软件虚拟验证等各个方面&#xff0c; 如图3.5所示&#xff0c; 其中深色…

什么是接口测试,如何做接口测试?

比起点点点的功能测试&#xff0c;“接口测试”显得专业又高大上&#xff0c;也因此让有些初级测试人员“望而生畏”。别担心&#xff0c;其实接口测试也是功能测试的一种&#xff0c;它是针对接口进行的功能测试。 写在前面&#xff1a;本文参考了茹炳晟老师的《测试工程师 全…

四张图片道清AI大模型的发展史(1943-2023)

四张图片道清AI大模型的发展史(1943-2023) 现在最火的莫过于GPT了&#xff0c;也就是大规模语言模型(LLM)。“LLM” 是 “Large Language Model”&#xff08;大语言模型&#xff09;的简称&#xff0c;通常用来指代具有巨大规模参数和复杂架构的自然语言处理模型&#xff0c;…

NuGet控制台命令初步使用

查看所有安装的包&#xff0c; 查找包&#xff0c;提示Nuget版本低&#xff1b;安装一个更高版本&#xff1b; 查看所有安装的包&#xff0c; 查找名字包含某字符串的包&#xff0c; 查找名字包含某字符串的包&#xff0c; 安装&#xff0c;使用-version指定版本&#xff0c;可…

AUTOSAR规范与ECU软件开发(实践篇)3.3 AUTOSAR系统解决方案介绍(下)

示例将遵循AUTOSAR方法论来进行开发&#xff0c; 所用的AUTOSAR解决方案如图3.6所示。 图3.6 AUTOSAR系统解决方案 首先&#xff0c; 使用Matlab/Simulink来实现部分软件组件级的开发&#xff0c; 主要包括LightRequestSWC和LightControlSWC&#xff0c; 并自动生成应用层软件组…

Python是什么?它有什么用途?

Python是什么&#xff1f; Python是一门具有优雅和简洁语法的高级编程语言。它由荷兰程序员Guido van Rossum创造并于上世纪90年代初发布。Python的设计理念强调可读性和清晰性&#xff0c;使得代码编写变得轻松且容易理解。这门语言以其独特的缩进方式来标记代码块&#xff0…

手撕LFU缓存

手撕LRU缓存_右大臣的博客-CSDN博客 是LRU的升级&#xff0c;多了一个访问次数的维度 实现 LFUCache 类&#xff1a; LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象int get(int key) - 如果键 key 存在于缓存中&#xff0c;则获取键的值&#xff0c;否则返…

16.3.4 【Linux】系统资源的观察

free &#xff1a;观察内存使用情况 系统当中有 2848MB 左右的实体内存&#xff0c;我的 swap 有 1GB 左右&#xff0c; 那我使用free -m 以 MBytes 来显示时&#xff0c;就会出现上面的信息。Mem 那一行显示的是实体内存的量&#xff0c;Swap 则是内存交换空间的量。 total 是…

Espresso测试用例运行前置配置条件

&#xff08;一&#xff09;【开发者选择】将USB调试/USB安装/USB调试&#xff08;安全设置&#xff09;开启&#xff1b; &#xff08;否则运行测试用例时&#xff0c;无法安装&#xff09; &#xff08;二&#xff09;开启【自启动】 &#xff08;需要授权&#xff0c;否则无…

51单片机的管脚介绍

图文介绍 纯文字说明 单片机管脚相关结构及其作用如下 电源正极引脚 一般接5V电源&#xff0c;为单片机提供正常工作时的电压。 电源负极引脚 接地。然后才开始工作。 时钟引脚 18、19脚为时钟引脚&#xff08;XTAL2、XTAL1&#xff09;。单片机内部有大量的数字电路&a…

Docker部署ES服务,canal全量同步的时候内存爆炸,ES/Canal Adapter自动关闭,CPU100%

文章目录 问题解决方案1. 对ES的限制2. 对Canal-Adapter的限制 问题 使用canal-adapter全量同步&#xff08;参考Canal Adapter1.1.5版本API操作服务&#xff0c;手动同步数据&#xff08;4&#xff09;&#xff09;的时候 小批量数据可以正常运行&#xff08;几千条&#xf…

Python获取、修改主机名称和IP地址实践

Python获取、修改主机名称和IP地址的方法有多种&#xff0c;内置socket模块、执行系统命令、第三方模块等等&#xff0c;本文只是完成功能的一次成功的实践。 1. 获取、修改主机名称 本案例使用python的socket模块获取、修改主机名称&#xff0c;socket模块是一个用于实现网络…

对抗通胀的信心回升,美国消费者预期短期通胀降至两年多低点

KlipC报道&#xff1a;据纽约联储最新消费者预期调查显示美国消费者预计一年后短期通胀从3.8%下降至3.5%&#xff0c;创2021年4月以来新低&#xff0c;为连续第四个月下降。三年期和五年期的通胀预期也下降&#xff0c;未来几年通胀将会走弱。 与此同时他们对个人的财务状况也趋…

JDK8 Optional优雅的判空操作

一、前言 在我们编程过程中因为疏忽经常会遇到NullPointerException空指针异常&#xff0c;所以与此同时就避免不了对变量一层一层的进行判空。JDK8新特性所提供的Optional类&#xff0c;可以让我们更优雅的进行判空操作。学习其的意义就是提醒开发者注意空值情况&#xff0c;…

怎么自己制作动图表情包?在线gif生成的操作步骤

gif表情包在我们平时的生活里斗图的时候经常会用到&#xff0c;那么如何用图片制作gif&#xff08;https://www.gif.cn&#xff09;表情包呢&#xff1f;今天就分享一个在线gif生成的简单方法&#xff0c;利用gif制作工具将图片转gif动图&#xff0c;下面是详细的操作步骤。 打…

爬楼梯(一次爬1或2层)

一&#xff0c;题目描述 二&#xff0c;解题思路 动态规划 动规五部曲&#xff1a; 1. 确认dp数组以及下标含义 2. 推导递推公式 3. 确认dp数组如何初始化 4. 确认遍历顺序 5. 打印dp数组 dp数组含义&#xff1a;到第i层的方法数目 下标含义&#xff1a;层数 递推公式&…

2023年服贸会在哪里举行?北京有哪些媒体可以做宣传?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 8月14日&#xff0c;”2023年服贸会新闻发布会在北京首钢园举行&#xff0c;宣布2023年服贸会将于9月2日至6日在国家会议中心和首钢园区举办&#xff0c;采用‘线下线上’‘综合专题’办…

跳跳!(贪心)

题目描述 你是一只小跳蛙&#xff0c;你特别擅长在各种地方跳来跳去。 这一天&#xff0c;你和朋友小 F 一起出去玩耍的时候&#xff0c;遇到了一堆高矮不同的石头&#xff0c;其中第 i 块的石头高度为 h_i&#xff0c;地面的高度是 h_0 0。你估计着&#xff0c;从第 i 块石…

eNSP:mplsvpn综合实验

要求完成下图实验&#xff1a; 拓扑信息标注&#xff1a; 命令操作&#xff1a; r1: <Huawei>sys [Huawei]sys r1 [r1]int lo0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int g 0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.2.1 30[r1]ip route-static 19…