C++多线程join,detach

2023-12-23 11:38
文章标签 c++ 多线程 detach join

本文主要是介绍C++多线程join,detach,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、介绍

在声明一个std::thread对象之后,都可以使用detach和join函数来启动一个线程,区别在于两者是否阻塞主线程。

(1)当使用join()函数时,主线程阻塞,等待被调用的线程终止,然后主线程回收被调用线程的资源,并继续运行;

(2)当使用detach()函数时,主线程继续运行,被调拥的线程驻留后台运行,主线程无法再取得该被调线程的控制权。当主线程结束时,由操作系统运行时库负责清理与被调线程相关的资源。
 

二、使用

joinable(),判断是否使用了join()或者detach(),是返回false,否返回true。

#include <iostream>
#include <thread>
void my_thread()
{for (int i = 1; i <= 5; i++){cout << "my_thread" << i << endl;}
}
int main()
{thread my_threadObj(my_thread);  //创建一个子线程,并传入子线程的函数入口my_threadif (my_threadObj.joinable())     //返回true代表没有使用join()或者detch(){my_threadObj.join();       //阻塞主线程,并让主线程等待子线程执行完//my_threadObj.detach();      //分离主线程,子线程与主线程各自运行,所以每次运行结果可能不}else{return -1;}
同for (int i = 1; i <=5; i++){cout << "main_thread" << i << endl;}system("pause");return 0;
}

运行结果

使用join(),注释掉detach()

 使用detach(),注释掉join()

 三、总结

当thread::join()函数被调用后,主调线程阻塞,等待被调线程终止,然后主调线程回收被调线程资源,并继续运行;注意,join()函数不能再次被调用,因为它已经不再和主调用线程相关联。

当thread::detach()函数被调用后,主调线程继续运行,被调线程驻留后台运行,主调线程无法再取得该被调线程的控制权。当主调线程结束时,由运行时库负责清理与被调线程相关的资源。

线程变成了后台进程。若不确定一个线程是否有thread object指向它,那么请先thread::joinable()检测后再thread::detach()。

参考:

std::thread的join和detach_wenion的博客-CSDN博客
C++多线程中的join, detach, joinable - 云+社区 - 腾讯云

这篇关于C++多线程join,detach的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527899

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用