【C++】join ()和detach ()函数详解和示例

简单的来说,join ()方法建立的线程具有阻碍作用,该线程不结束,另一些函数就无法运行。detach ()方法建立的线程,可以和另一些函数同时进行。下面以示例进行详细说明,以帮助大家理解和使用。

目录

  • join ()
  • detach ()

join ()

join 方法用于等待线程结束。当一个线程对象调用 join 方法时,当前线程将阻塞,直到该线程对象所代表的线程结束。如果该线程对象所代表的线程已经处于结束状态,则 join 方法立即返回。注意,如果一个线程对象被析构(也就是离开其作用域),而该线程对象所代表的线程仍在运行,程序将终止。

以下是一个 join 的示例:

#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Hello from the thread!\n";
}

int main() {
    int i = 3;
    while (i) 
    {
        std::thread t(threadFunction);  // 创建一个新线程,t 是该线程的对象
        t.join();  // 等待新线程结束
        std::cout << "Hello from the main thread!\n";
        i--;
    }
   
    return 0;
}

输出:

Hello from the thread!
Hello from the main thread!
Hello from the thread!
Hello from the main thread!
Hello from the thread!
Hello from the main thread!

在这个例子中,先建立一个while()循环,执行三次主程序中内容。程序首先创建一个新线程并开始运行 threadFunction。然后,主线程调用 t.join(),这将阻塞主线程,直到新线程结束。当新线程结束时,主线程将继续执行,输出 “Hello from the main thread!”。
在这里插入图片描述
从输出结果中可以看出,主程序输出和线程输出有着先后顺序,与原理一致。

detach ()

在C++中,std::thread::detach()函数用于将线程“分离”出当前对象。当一个线程对象调用detach()方法时,该线程对象将不再与该线程有任何关联。一旦线程分离出来,它将独立运行,直到完成。注意,一旦线程完成,系统会自动回收其资源。

下面是一个使用std::thread::detach()函数的示例:

#include <iostream>
#include <thread>

void threadFunction() {
    while (1)
    {
        std::cout << "Hello from the thread!\n";
    }
  
}

int main() {
    int i = 3;
    while (i) {
        std::thread t(threadFunction);  // 创建一个新线程,t 是该线程的对象
        t.detach();  // 将新线程分离出去,它将继续运行直到完成
        std::cout << "Hello from the main thread!\n";  // 这会立即输出,不会等待新线程结束
        i--;
    }
 
    return 0;
}

输出:

Hello from the main thread!
Hello from the main thread!
Hello from the main thread!
Hello from the thread!
Hello from the thread!
Hello from the thread!
Hello from the thread!

在这里插入图片描述

在这个例子中,也是先用一个while循环。从输出的结果可以看出,与join()的有序性不同,建立的线程和主线程是在同时进行的。

需要注意的是,一旦线程被分离出去,它就不再受原线程的控制和影响。因此,无法通过原线程来获取该线程的执行结果或等待其结束。如果需要等待线程执行完毕后再继续执行其他操作,可以使用 join() 方法来阻塞等待线程结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core mvc之 局部视图 和视图组件

一、局部视图是什么&#xff1f; 1、局部视图也是 .cshtml文件 2、将重复使用的内容&#xff08;如&#xff1a;右侧栏&#xff09;&#xff0c;做出局部视图&#xff0c;供其他视图调用 3、局部视图不会执行 _ViewStart.cshtml 二、局部视图示例 1、在 /Views/Shared目录右…

python合并多个CSV文件成一个

之前写的是合并Excel&#xff0c;这次是操作CSV文件&#xff0c;可以看到文件非常多 每一个文件里面前两行是表头&#xff0c;无关信息&#xff0c;因此合并的时候需要略过&#xff1a; python代码如下&#xff1a; import os import csv# 输入文件夹路径和输出文件路径 inp…

印刷设备丝杆选择研磨杆还是冷轧杆好?

在印刷设备中&#xff0c;选择研磨杆还是冷轧杆取决于具体的使用需求和设备要求。以下是关于两种丝杆选择的要点&#xff1a; 1、精度要求&#xff1a;研磨杆通常具有更高的制造精度&#xff0c;能够有效保证印刷设备的精度和稳定性。研磨杆经过精细研磨和校准&#xff0c;具有…

Python语言:文件的操作与使用

Python语言可以对电脑中的文件进行一系列操作&#xff0c;包括文件的打开与关闭&#xff0c;文件内容的读取和追加等。 打开文件 语法&#xff1a;使用open函数 使用python语言的内置open函数打开一个文件&#xff0c;里面有三个参数可以指定文件的路径&#xff0c;操作方式&a…

python实现双臂老虎机k-armed-bandit

老虎机&#xff0c;投入钱币会随机返还钱币&#xff08;reward&#xff09; 这里设置两台老虎机&#xff0c;一台均值500&#xff0c;标准差5&#xff0c;一台均值550&#xff0c;标准差10 初始值均为998&#xff0c;更新规则为reward之和/轮数 最后结果会在均值附近收敛 impo…

山东省技能兴鲁网络安全大赛 web方向

文章目录 购买FLAG日志里的FLAG一只小蜜蜂 购买FLAG 随便登录admin进去&#xff0c;发现有充值和购买功能 但是试试充值发现不行 购买页面如下 bp抓包看看&#xff0c;发现value值可控 我们试试将其改为正数&#xff0c;发现成功 购买得到flag 日志里的FLAG <?phphi…

创新的Sui项目在CoinDCX的Unfold 2023黑客松中获奖

近日&#xff0c;在印度班加罗尔&#xff08;Bengaluru&#xff09;&#xff0c;超过2500人参加了CoinDCX组织的综合性Web3活动Unfold 2023。作为讨论、聚会和活动的一部分&#xff0c;进行了一次多链黑客松&#xff0c;Sui联合赞助了该活动。所有团队&#xff0c;无论他们构建…

企业如何利用好用户画像对客户进行精准营销?提高营销转化?

随着市场竞争的加剧&#xff0c;企业对于客户的需求和行为越来越关注&#xff0c;如何利用好用户画像对客户进行精准营销&#xff0c;提高营销转化&#xff0c;成为企业关注的焦点。 一、了解用户需求和行为 首先&#xff0c;企业需要了解客户的需求和行为&#xff0c;包括客户…

Docker技术教程

利用Docker快速安装MySQL 运行结果如下&#xff1a;

C++入门(1)

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种&#xff1a; 第二种&#xff1a; 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

Springboot 程序实现加密,禁止 jadx 反编译

在Spring Boot中实现程序加密和禁止jadx反编译是一个复杂的问题。虽然无法完全禁止反编译&#xff0c;但可以通过一些技术手段来提高代码的安全性。 以下是一些可能的措施&#xff1a; 使用混淆工具&#xff1a;使用Java代码混淆工具&#xff08;如ProGuard或YGuard&#xff0…

MySQL MVCC机制详解

MySQL MVCC机制详解 MVCC, 是Multi Version Concurrency Control的缩写&#xff0c;其含义是多版本并发控制。这一概念的提出是为了使得MySQL可以实现RC隔离级别和RR隔离级别。 这里回顾一下MySQL的事务&#xff0c; MySQL的隔离级别和各种隔离级别所存在的问题。 事务是由 …

Sandbox: bash(5613) deny(1) file-write-create 错误解决

Showing Recent Errors Only Sandbox: bash(5613) deny(1) file-write-create /Users/xx/Dev/UniappLearn/MSLUniappDemo/Pods/resources-to-copy-MSLUniappDemo.txt image.png 解决方法 build setting搜索ENABLE_USER_SCRIPT_SANDBOXING&#xff0c;YES&#xff08;默认&…

揭秘软件测试培训骗局:如何从贩卖焦虑到高薪包就业

你可能并不是一个IT行业的从业者&#xff0c;也可能是第一次听说软件测试工程师这个岗位。但由于看了某个网站的广告&#xff0c;或者听某个人说可以花钱培训软件测试技术&#xff0c;入职软件测试工程师岗位&#xff0c;于是动了这方面的心思。 但是互联网上有很多地方说&…

JavaScript中的原型和原型链

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 原型和原型链是JavaScript中一个重要且常常被误解的概念。它们在理解对象、继承和属性查找时扮演着关键的角色。 1…

clickhouse的安装和配置

使用虚拟机测试, 系统为ubuntu 22.04 一 安装 sudo apt-get install -y apt-transport-https ca-certificates dirmngr sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754echo "deb https://packages.clickhouse.com/deb stable ma…

μC/OS-II---内存管理2(os_core.c)

流程---内存管理扩展 初始化μC/OS-II创建用户起始任务开始多任务调度统计Task创建用户应用程序任务 初始化μC/OS-II void OSInit (void) {OSInitHookBegin(); /* Call port specific initialization code */OS_InitMisc(); …

μC/OS-II---Task管理2(os_task.c)

目录 改变Task优先级Task挂起Task恢复Task信息获取Task调度器上锁&#xff08;os_core.c&#xff09;Task调度器开锁&#xff08;os_core.c&#xff09; 改变Task优先级 #if OS_TASK_CHANGE_PRIO_EN > 0u INT8U OSTaskChangePrio (INT8U oldprio,INT8U newprio) { #if (…

2023/11/14JAVA学习

主子线程每次执行顺序可能都不一样

什么猫罐头好吃?猫咪嘎嘎炫的5款猫主食罐头推荐!

想必铲屎官都知道给猫咪长期吃主食罐头的好处了吧&#xff01;主食罐头不仅营养丰富&#xff0c;还能让猫咪顺便补充水分。有时候猫咪食欲不佳&#xff0c;一罐猫主食罐头就能让它们胃口大开呢~ 作为家里有3只猫的铲屎官来说&#xff0c;养猫的这几年可以说血泪史了&#xff0…