首页 > 其他分享 >线程启动、结束,创建线程多法、join,detach

线程启动、结束,创建线程多法、join,detach

时间:2023-07-17 09:45:28浏览次数:38  
标签:include join 主线 线程 test 多法 detach

线程启动、结束,创建线程多法、join,detach

视频链接:https://www.bilibili.com/video/BV1Yb411L7ak/?p=4&spm_id_from=333.880.my_history.page.click&vd_source=4c026d3f6b5fac18846e94bc649fd7d0
参考博主文章:https://blog.csdn.net/qq_38231713/article/details/106091372
img

join

示例代码

#include<iostream>
#include<thread>
using namespace std;
void test() {
	cout << "子线程开始" << endl;
	cout << "子线程结束" << endl;
}
int main() {
	 
	thread mythred(test);
	mythred.join();
	cout << "主线程结束" << endl;

}

结果示意图
img

代码解释

#include<thread>:导入线程库
thread mythred(test):创建进程这个类
mythred.join():join意思是汇合,阻塞主线程并等待myPrint执行完,当test执行完毕,join()就执行完毕,主线程继续往下执行
img
这样加断点可以知道可以知道mythred(test)一发生就test也开始了运行,但因为有join的出现所以必须等test执行完毕才行

因此一个(传统)良好的程序,必须是主线程等待所有子线程做完以后才能退出
下面就会打破这句话

detach()

可以实现分离,你走你的阳关道,我过我的独木桥
detach:分离,主线程不再与子线程汇合,不再等待子线程
detach后,子线程和主线程失去关联,驻留在后台,由C++运行时库接管,并且当子线程执行完成后,由运行时库负责清理相关的资源

示例代码

#include<iostream>
#include<thread>
using namespace std;
void test() {
	cout << "子线程开始" << endl;
	cout << "子线程结束" << endl;
}
int main() {
	 
	thread mythred(test);
	mythred.detach();
	cout << "主线程结束" << endl;
	return 0;
}

结果展示
img

代码解释

首先解释一下为什么子线程没有输出,其实是有的,但是因为主线称结束的太快,子线程还没开始就结束了,所以只要给主线程再加一些代码,让他运行的久一点,那么子线程就能数出了
mythred.detach():分离,主线程不再与子线程汇合,不再等待子线程

提醒

一旦detach后,就不能在join了

joinable()

判断是否可以成功使用join()或者detach()
有点简单直接上代码

#include <iostream>
#include <thread>
using namespace std;

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

int main()
{

	thread myThread(myPrint);

	myThread.join();

	//(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;
}

补充说明

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

//main函数里的:
	Ta ta;
	thread myThread(ta);
	myThread.join();

这里有一点要补充说明,thread myThread(ta)里面传进去的ta不是真正的ta,而是复制一个ta在传进去(如果这个类他有拷贝构造的话,那么你将会看到它调用了拷贝构造),也就避免了主线程结束回收了ta,从而影响子线程运行,这里也给一个忠告,既然想到了主线程会回收,那么子线程要注意&引用,因为可能这个值传进去子线程,而主线程结束把这个值回收了。

lambda表达式

Lambda表达式是一种匿名函数的简洁写法,也被称为函数字面量。它允许您在需要函数的地方定义一个函数,而不必显式地给函数起一个具体的名字。Lambda表达式通常用于函数式编程中,特别是在需要传递函数作为参数或在需要简洁地定义函数的地方。(可以多去了解一下)

#include<iostream>
#include<thread>
using namespace std;
int main() {
	auto lambdaThread = [] {
		cout << "子线程开始" << endl;
		cout << "子线程结束" << endl;
	};
	thread mythred(lambdaThread);
	mythred.join();
	cout << "主线程开始" << endl;


	return 0;
}

标签:include,join,主线,线程,test,多法,detach
From: https://www.cnblogs.com/yjydxuexi/p/17559153.html

相关文章

  • 常用语言的线程模型(Java、go、C++、python3)
    背景知识软件是如何驱动硬件的?硬件是需要相关的驱动程序才能执行,而驱动程序是安装在操作系统内核中。如果写了一个程序A,A程序想操作硬件工作,首先需要进行系统调用,由内核去找对应的驱动程序驱使硬件工作。而驱动程序怎么让硬件工作的呢?驱动程序作为硬件和操作系统之间的媒介,可以......
  • 使用Java线程同步工具类CountDownLatch
    java.util.concurrent.CountDownLatch是Java并发并发编程中的线程同步工具类,基于AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)实现。CountDownLatch工具类主要应用在如下场景:等待一组线程执行完毕后继续执行后续操作。应用举例:模拟使用多个线程同时调用多个RPC方......
  • 使用Java线程同步工具类CyclicBarrier
    如何使用java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLock实现。CyclicBarrier工具类主要应用在如下场景:让一组线程同时到达栅栏位置才能开始执行。应用示例:publicstaticvoidmain(String[]args){......
  • 【线程池添加工作线程的流程】
    线程池添加工作线程:首先,线程池需要有一个存储工作线程的容器,比如可以使用一个List或者Queue。然后,使用一个变量来保存当前线程池中的线程数。在添加工作线程之前,需要进行两个判断。第一个判断是当前线程池中的线程数是否超过了最大线程数。如果超过了最大线程数,那么直接返......
  • ThreadPoolTaskExecutor自定义线程池的配置和使用
    ThreadPoolTaskExecutor自定义线程池的配置和使用线程池ThreadPoolTaskExecutor和ThreadPoolExecutor的区别ThreadPoolExecutor,这个类是JDK中的线程池类,继承自Executor,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程,避免了创......
  • 什么是进程和线程? 为什么要引入线程? 进程和线程的区别?
    什么是进程和线程?为什么要引入线程?进程和线程的区别? 什么是进程和线程?什么是进程?进程是程序在某个数据集合上的一次运行活动(不仅包含正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU、内存、网络资源等),也是操作系统进行资源分配和保护的基......
  • StringJoiner
    JDK8出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。在拼接的时候,可以指定间隔符号,开始符号,结束符号。1publicclassdemo15StringJoiner{2publicstaticvoidmain(String[]args){3int[]arr={1,2,3,4,5,};4StringJoine......
  • spring boot 接口多线程
    SpringBoot接口多线程在单线程的环境中,当接口请求过多时,容易造成阻塞和性能问题。为了提高系统的响应速度和吞吐量,我们可以使用多线程来处理接口请求。本文将介绍如何在SpringBoot中使用多线程处理接口请求,并给出相应的代码示例。什么是多线程多线程是指在一个进程中同时执行......
  • Java-多线程-八股文
    线程安全的理解?线程安全说的是,当多个线程并发访问互斥资源时,读写互斥资源的代码逻辑能正常处理,获得正确结果,不会互相干扰的情况。守护线程的理解?守护线程是与普通线程相区分的概念,用户一般使用的就是普通线程,普通线程有自身独立的生命周期,而守护线程的生命周期取决于普通......
  • Python的多线程(threading)与多进程(multiprocessing )
    可以用来做后台任务,可以在djangoview中调用,当做异步任务考核系统中要的threading,用来异步考核结果和考核进度的统计Python的多线程(threading)与多进程(multiprocessing)......