首页 > 其他分享 >thread 中 join 和 detach 函数

thread 中 join 和 detach 函数

时间:2023-05-13 22:23:55浏览次数:36  
标签:执行 调用 join 函数 thread 线程 detach

在C++中,库提供了多线程编程的功能,其中包含了std::thread类,该类用于创建和控制线程。std::thread类提供了两个重要的成员函数:join()和detach(),用于管理线程的生命周期。

join()函数:

join()函数用于等待线程执行完成,并将线程的执行结果合并到当前线程。换句话说,join()函数会阻塞当前线程,直到被调用的线程结束。
当线程执行完成后,join()函数会销毁线程对象,并释放相关资源。
如果不调用join()函数,线程对象的析构函数会自动调用std::terminate(),导致程序异常终止。
一个线程只能调用一次join()函数,多次调用会导致程序崩溃。
示例代码:

#include <iostream>
#include <thread>

void foo() {
    // 线程执行的代码
    std::cout << "Hello from foo!" << std::endl;
}

int main() {
    std::thread t(foo);  // 创建线程对象
    t.join();            // 等待线程执行完成
    std::cout << "Thread execution completed." << std::endl;
    return 0;
}

在上述示例中,main()函数创建了一个名为t的线程对象,并调用join()函数等待线程执行完成。执行结果是先输出"Hello from foo!",然后输出"Thread execution completed."。
detach()函数:

detach()函数用于将线程与当前线程分离,使得线程可以独立执行,不再受当前线程的控制。
调用detach()函数后,线程对象会交出线程的控制权,线程会在后台继续执行。
线程执行完成后,相关资源会由操作系统自动释放。
与join()函数不同,detach()函数可以被调用多次。
示例代码:

#include <iostream>
#include <thread>

void foo() {
    // 线程执行的代码
    std::cout << "Hello from foo!" << std::endl;
}

int main() {
    std::thread t(foo);  // 创建线程对象
    t.detach();          // 分离线程
    std::cout << "Thread detached." << std::endl;
    // 注意,这里没有调用 join() 或 detach()
    return 0;
}

在上述示例中,main()函数创建了一个名为t的线程对象,并调用detach()函数将线程与当前线程分离。执行结果是先输出"Thread detached.",然后在后台执行线程中的代码,输出"Hello from foo!"。
需要注意的是,使用join()和detach()函数时需要仔细考虑线程的生命周期和资源管理。如果线程被detach()函数分离,那么线程将在后台独立执行,不受当前线程的控制。这意味着当前线程无法获取分离线程的执行结果或等待其完成。因此,使用detach()函数时需要确保分离线程能够安全地独立执行,并不再需要与其进行交互。

如果在一个线程对象上既调用了join()函数又调用了detach()函数,或者没有调用任何一个函数,这将导致未定义的行为。

需要注意的是,在C++11标准中,一个线程对象默认是可被join()的,即如果没有显式调用join()或detach(),线程对象的析构函数将会自动调用std::terminate(),导致程序异常终止。因此,在使用线程时,确保对每个线程对象都显式调用了join()或detach()函数是很重要的。

以下是一些关于join()和detach()的一般性原则:

如果需要等待线程执行完成并获取其结果,应该使用join()函数。
如果不关心线程的执行结果,或者希望线程在后台独立执行,应该使用detach()函数。
在决定调用join()还是detach()之前,需要考虑线程的生命周期和资源管理,确保不会导致资源泄漏或未定义的行为。
避免多次调用join()函数,这会导致程序崩溃。
确保每个线程对象都调用了join()或detach()函数,以避免程序异常终止。
总结起来,join()和detach()函数是用于管理线程生命周期的重要工具。join()用于等待线程执行完成并合并结果,而detach()用于分离线程,使其在后台独立执行。正确使用这两个函数可以有效控制线程的执行和资源管理,从而实现多线程编程的目标。

标签:执行,调用,join,函数,thread,线程,detach
From: https://www.cnblogs.com/hacker-dvd/p/17398352.html

相关文章

  • MySQL学习日志七,联表查询Join ON
    网上找的七种Join查询图片--查询参加考试的同学,包含的信息包括学号,姓名,科目编号,分数/*分析思路1.分析需求,查询的字段涉及到哪些表2.确定要哪些连接查询3.确定交叉点,涉及到的表有哪些相同的字段判断条件:学生表的studentno=成绩表的studentno*/joinon连接查询joinw......
  • STATA joinby命令
    joinby。当我们进行数据的横向合并时,经常会用到merge命令,但是在使用merge命令进行一对一合并、一对多合并、多对一合并和多对多合并都不是我们想要的结果时,可以考虑使用joinby组内交叉合并。老规矩,还是先上命令语法和选项介绍。一、命令介绍1、命令语法 joinby[varlist]usin......
  • STM32裸机移植RT-Thread(标准版)
    前言,因为我嫌正点原子stm32l475vet6(潘多拉)给的rt-thread太过臃肿,决定自己移植一遍(RT-Thread包来自正点原子中潘多拉例程)参考了野火rt-thread的手册1、建立工程文件夹,如下      CoreCore/IncCore/src用于存放用户自己的.c和.h文件 Dri......
  • spring aop MethodSignature = (MethodSignature) joinPoint.getSignature();
    MethodSignaturesignature=(MethodSignature)joinPoint.getSignature();为什么这里可以转回为MethodSignatrue,官网上没有这么说,如果这里转换失败,那运行会报错,这是不允许的。必须找到调用这里的代码,看看这里的Signature 是怎么放进去的。网上找了好久没有找到相关知识......
  • Python多线程(multithreading)
    1.threading模块Python3线程中常用的两个模块为:_thread,threading(推荐使用).thread模块已被废弃,为了兼容性,Python3将thread重命名为_thread,即通过标准库_thread和threading提供对线程的支持。_thread提供了低级别的、原始的线程以及一个简单的锁,它相比于threading模块的功能还......
  • 2020-07-30-python-multithreading&multiprocessing
    注:参考Python多线程多进程那些事儿看这篇就够了~~进程、线程进程和线程简单举例:对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程。有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要......
  • 关于使用kubeadm reset命令对kubeadm init与kubeadm join操作后遇到报错的情况-进行恢
    在Kubernetes/k8s集群中,无论是在开始的master节点初始化,还是后面客户端使用kubeadmjoin命令加入到集群可能都会遇到很多报错,对于新手来说、很多还不是很好解决、也有一些情况,是在初始化之前忘记执行一些操作,而导致报错这种一般都需要执行漏掉的操作,重新执行初始化操作,但是如......
  • ThreadLocal让你的多线程编程更简单【Java多线程必备】
    一、介绍ThreadLocal是Java中的一个线程局部变量,该变量在多线程并发执行时,为每个线程都提供了一个独立的副本。简单来说,ThreadLocal提供了一种在多线程环境中,使每个线程绑定自己独立的变量的方法,每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。二、特性1.......
  • MySQL中的Join 的算法(NLJ、BNL、BKA)
    本文已收录至Github,推荐阅读......
  • 【大数据】Hive Join 的原理与机制
    目录一、概述二、环境准备三、HiveJOIN类型四、Map,Shuffle,Reduce三阶段1)Map阶段2)Shuffle阶段3)Reduce阶段五、CommonJoin(Reduce阶段)六、MapJoin(Map阶段)一、概述Hive是一个基于Hadoop的数据仓库解决方案,它提供了类似于SQL的查询语言,称为HiveQL,用于处理结构化数据。在Hive中......