Linux多线程编程- pthread_detach()

基本概念

pthread_detach 函数是 POSIX 线程(pthreads)库的一部分,它用于将指定的线程置于分离状态(detached state)。分离状态的线程在终止时会自动释放其资源回操作系统,包括线程的堆栈和线程描述符。这意味着其他线程不需要并且也不能对分离线程调用 pthread_join 来回收其资源。

当创建一个线程时,默认情况下它是可结合的(joinable),这意味着其他线程可以通过调用 pthread_join 等待该线程结束,并回收该线程结束时返回的资源。然而,在某些情况下,我们可能不需要等待线程结束,也不打算从线程收回任何值。在这种情况下,可以使用 pthread_detach 函数将线程置为分离状态。

函数原型:

int pthread_detach(pthread_t thread);

参数:

  • thread: 要分离的线程的标识符,通常是 pthread_create 调用返回的线程ID。

返回值:

  • 如果成功,函数返回0。
  • 如果失败,函数将返回一个非零错误码。

使用示例:

#include <pthread.h>
#include <stdio.h>void* thread_function(void* arg) {// 线程的操作printf("Hello from the detached thread!\n");// 自动释放资源,无需其他线程调用 pthread_joinpthread_exit(NULL);
}int main(void) {pthread_t thread_id;// 创建线程pthread_create(&thread_id, NULL, &thread_function, NULL);// 将线程设置为分离状态if (pthread_detach(thread_id) != 0) {perror("pthread_detach");}// 主线程可以继续执行其他任务,不需要等待分离线程结束// ...return 0;
}

在这个示例中,一个线程被创建并且立即被分离。分离线程会打印一条消息然后退出,而主线程继续执行其他任务。由于线程是分离的,一旦线程结束,它的资源会自动被清理,而不需要主线程采取任何动作。

注意事项:

  • 一旦线程被分离,它不能再被结合(即不能再对它调用 pthread_join)。
  • 如果试图对一个已经分离的线程调用 pthread_join,会导致未定义行为。
  • 一个线程可以在创建之后的任意时刻被分离,甚至可以在线程自身内部调用 pthread_detach(pthread_self()) 来分离自己。
  • 分离线程的主要好处是可以避免线程终止时的资源泄漏。

示例

我们创建一个线程来执行一项任务,并将其设置为分离状态。这样做的好处是,我们不需要在主线程中对它调用 pthread_join,线程结束时会自动释放所有资源。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *do_work(void *arg) {(void) arg;printf("Thread is running...\n");sleep(2);  // 假设这个线程要处理一个耗时的任务printf("Thread has finished its work and will now terminate.\n");pthread_exit(0);
}int main() {pthread_t thread;int ret;// 创建线程ret = pthread_create(&thread, NULL, &do_work, NULL);if (ret != 0) {fprintf(stderr, "Error: pthread_create() failed\n");return 1;}// 将线程设置为分离状态ret = pthread_detach(thread);if (ret != 0) {fprintf(stderr, "Error: pthread_detach() failed\n");return 1;}printf("Main thread is running and does not need to wait for the child thread.\n");// 让主线程做其他事情或者睡眠一段时间// 注意,主线程在这个示例中必须有足够的寿命来让子线程完成任务sleep(3);printf("Main thread will now exit. Detach thread will release its resources on completion.\n");return 0;
}

这个程序做了以下几件事情:

  1. 定义了一个 do_work 函数,该函数是线程将要执行的任务。在这个例子中,线程只是简单地打印一条消息,睡眠2秒,然后再次打印一条消息。

  2. main 函数中,我们创建了一个新的线程,并且立即将它设置为分离状态。这意味着一旦线程完成执行,它就会自动清理自己分配的资源。

  3. main 函数继续执行,打印一条消息并休眠3秒以保持进程活动,从而给子线程足够的时间完成它的工作。在这个睡眠期间,分离的子线程会在后台运行。

  4. 当主线程完成睡眠后,程序打印一条消息并退出。由于子线程已经分离,主线程退出时不需要清理子线程的资源。

程序运行结果如下:

$ ./detach
Main thread is running and does not need to wait for the child thread.
Thread is running...
Thread has finished its work and will now terminate.
Main thread will now exit. Detach thread will release its resources on completion.

在实际应用中,分离线程通常用于处理那些不需要与其他线程同步完成的后台任务或者服务请求,主线程可以继续其它的操作,而无需等待这些分离线程的结束。

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

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

相关文章

Excel中截取特殊字符之前、之间、之后的数据

1、第一个数据&#xff0c;“*” 之前的数据&#xff0c; 公式 &#xff1a;LEFT(J2,FIND("*",J2)-1) 2、第二个数据&#xff0c;两个 “*” 之中的数据&#xff0c; 公式 &#xff1a;MID(J2,FIND("*",J2)1,FIND("*",J2,FIND("*",…

ZZULIOJ 1108: 打印数字图形(函数专题) (C/C++)

1108: 打印数字图形&#xff08;函数专题&#xff09; 题目描述 从键盘输入一个整数n(1≤n≤9),打印出指定的数字图形。要求在程序中定义并调用如下函数&#xff1a;PrintSpace(m)用来输出m个空格&#xff1b;PrintDigit(m)来输出一行中的数字串"12…m…21"&#xff…

IP协议汇总

IP协议 1.基本概念 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;” ,IP协议是TCP/IP体系中的网络层协议。 总的来说&#xff0c;IP协议的最重要功能是提供了一种标准化的方式来路由和传输数据包&#xff0c;以实现全球互联网上的通信。 &#xff…

CJSON解析json字符串示例

cJSON 作为 Json 格式的解析库,其主要功能就是构建和解析 Json 格式 CJSON解析json字符串 {"action":"started","code":"0","data":"","desc":"success","sid":"a8"} …

图的结构模板及遍历

图&#xff1a;由点的集合和边的集合组成。 常用的表示图的方法有两种&#xff1a; 1、邻接表法 将一个点的邻居都列出来。有向图只列出从这个点出发向外发散的点 2、邻接矩阵法 将点集列出一列行&#xff0c;列出一列列&#xff0c;在矩阵中填两点之间的权值&#xff08;距…

SpringBoot集成-阿里云对象存储OSS

文章目录 阿里云 OSS 介绍准备工作SpringBoot 集成 OSS 阿里云 OSS 介绍 阿里云对象存储 OSS &#xff08;Object Storage Service&#xff09;&#xff0c;是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS&#xff0c;你可以通过网络随时存储和调用包括文本、图片、…

【每日OJ题—— 142. 环形链表 II (链表)】

每日OJ题—— 142. 环形链表 II &#xff08;链表&#xff09; 1.题目&#xff1a;142. 环形链表 II 2.方法讲解2.1.解法一&#xff1a;2.1.1.图文解析2.1.2.代码实现2.1.3.提交通过展示 2.2解法二:2.2.1图文解析2.2.2代码实现2.2.3.提交通过展示 1.题目&#xff1a;142. 环形链…

从使用的角度看 ByConity 和 ClickHouse 的差异

自 ClickHouse Inc 宣布其重要新功能仅在 ClickHouse Cloud 上开放以来&#xff0c;一些关注 ByConity 开源的社区小伙伴也来询问 ByConity 后续开源规划。为回答社区疑问&#xff0c;我们将之前分享的关于 ByConity 与 ClickHouse 相关功能对比的 webinar 整理为文章&#xff…

AI 编程界的扛把子

大家好&#xff0c;我是伍六七。 全国最大 AI 社群《AI 破局俱乐部》初创合伙人。8 年 Java 经验&#xff0c;干过开发&#xff0c;也做过管理。目前在某互联网大厂从事 Java 开发&#xff0c;业余时间研究 AI 编程。 我从 2022 年底&#xff0c;ChatGPT 问世&#xff0c;就密…

【第28例】IPD体系进阶 | 需求管理:需求实现过程

目录 简介 内容详解 CSDN学院相关推荐 作者简介 简介 继续 IPD 体系中的需求管理相关的专题。 先来看看整个需求管理涉及的过程内容: 需求管理流程主要包含五个阶段: 需求收集; 需求分析; 需求分发/分配;

【Python报错合集】Python元组tuple、张量tensor(IndexError、TypeError、RuntimeError……)~持续更新

文章目录 IndexError1. tuple index out of rangea. 示例代码b.报错原因c.解决方案 TypeError1. len() of a 0-d tensora. 示例代码b.报错原因c.解决方案 RuntimeError1. output with shape … doesnt match the broadcast shape …a. 示例代码b.报错原因c.解决方案 2. Cant ca…

npm install:sill idealTree buildDeps

执行npm install&#xff0c;卡在 sill idealTree buildDeps PS D:\workspace-groovy\attendance-india-web> npm install -g cnpm --registryhttps://registry.npm.taobao.org [..................] / idealTree:node_global: sill idealTree buildDeps[.................…

Web3游戏的十字路口:沿用传统IP还是另起炉灶?

人们经常问我对 Web3 游戏有什么看法。因此&#xff0c;我想以书面形式概述一下我目前的想法。 让我先澄清一下&#xff1a;我不是专家。这不是一篇深入探讨游戏世界精细指标如 MAU 或 D14 等的全面分析。请把这看作是我根据个人交流和研究&#xff0c;这反映我在游戏领域关注…

本地部署 CogVLM

本地部署 CogVLM CogVLM 是什么CogVLM Github 地址部署 CogVLM启动 CogVLM CogVLM 是什么 CogVLM 是一个强大的开源视觉语言模型&#xff08;VLM&#xff09;。CogVLM-17B 拥有 100 亿视觉参数和 70 亿语言参数。 CogVLM-17B 在 10 个经典跨模态基准测试上取得了 SOTA 性能&am…

hdlbits系列verilog解答(always块case语句2)-34

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 优先级编码器是一种组合电路,当给定输入位向量时,它输出向量中第一个 1 位的位置。例如,给定输入 8’b10010000 的 8 位优先级编码器将输出 3’d4 ,因为 bit[4] 是第一个高位。 构建 4 位优先级编码器。对…

响应式建筑房地产开发企业网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;5635 模板编码&#xff1a;UTF8 模板颜色&#xff1a;红色 模板分类&#xff1a;基建、施工、地产、物业 适合行业&#xff1a;房地产类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0…

每天一点python——day61

#第61天 #字符串的驻留机制字符串&#xff1a;python中基本数据类型&#xff0c;是一个不可变的序列【目前我们学了两个&#xff1a;元组、字符串】 可以使用单引号&#xff0c;双引号&#xff0c;三引号来定义#定义字符串 apython#用单引号&#xff0c;双引号&#xff0c;三引…

如何解决msvcp140.dll文件丢失问题,msvcp140.dll丢失的解决方法

在使用电脑时&#xff0c;有时我们可能会遇到一些错误提示&#xff0c;比如“找不到msvcp140.dll文件”。这是因为某些程序需要依赖于msvcp140.dll文件才能正常运行。这个问题是可以解决的,大家不需要担心&#xff0c;而且其解决的方法是有很多种的&#xff0c;今天我们就来给大…

数据库系统原理与实践 笔记 #7

文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…

利用Graviton2和S3免费套餐搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制&#xff0c;比如限制下载速度&#xff0…