LINUX下设置分离状态(Detached State)和未设置分离状态的主要区别在于线程资源的管理方式和线程的生命周期。以下是两种状态的对比:

1. 设置分离状态(Detached State)

  • 资源管理:

    • 线程终止时,系统会自动释放与线程相关的所有资源(如线程栈、线程控制块)。
    • 不需要其他线程显式回收(pthread_join)。
  • 线程生命周期:

    • 一旦线程开始运行,其与创建它的线程之间就不存在显式的同步关系。
    • 不能通过 pthread_join获取线程的返回值。
  • 典型应用场景:

    • 适用于不需要等待线程完成或获取其结果的场景。
    • 例如后台任务或独立的服务线程。
  • 优点:

    • 简化线程管理,减少同步代码。
    • 避免忘记调用 pthread_join导致的资源泄漏。
  • 缺点:

    • 无法获取线程的退出状态或确保线程已完全完成。

2. 未设置分离状态(默认状态)

  • 资源管理:

    • 线程终止后,其资源不会自动释放。
    • 必须由其他线程调用 pthread_join来回收资源。
  • 线程生命周期:

    • 线程终止后进入“僵尸状态”(zombie state),资源仍占用,但线程已经不再执行。
    • 需要调用 pthread_join来清理资源。
  • 典型应用场景:

    • 需要获取线程返回值或确保线程完成的场景。
    • 例如需要同步多个工作线程结果的主线程。
  • 优点:

    • 可以通过 pthread_join获取线程的退出状态。
    • 能与线程进行明确的同步。
  • 缺点:

    • 必须显式调用 pthread_join,稍有遗漏可能导致资源泄漏。
    • 如果调用了 pthread_join的线程被阻塞,可能引发性能问题。

      3. 具体区别对比表

      特性分离状态(Detached State)非分离状态(默认状态)
      资源释放线程终止时,系统自动释放资源需要显式调用 pthread_join释放资源
      线程返回值无法通过 pthread_join获取返回值可以通过 pthread_join获取返回值
      同步不支持显式同步通过 pthread_join实现同步
      僵尸线程无僵尸线程终止后进入僵尸状态,需 pthread_join清理
      调用方式通过 pthread_attr_setdetachstate 设置分离状态默认创建为非分离状态

      4. 示例代码对比

    • 分离状态:
      #include <pthread.h>
      #include <stdio.h>
      #include <unistd.h>void* thread_func(void* arg) {printf("Detached thread running...\n");sleep(2); // 模拟工作printf("Detached thread exiting...\n");pthread_exit(NULL);
      }int main() {pthread_t thread;pthread_attr_t attr;// 初始化属性pthread_attr_init(&attr);// 设置分离状态pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);// 创建线程pthread_create(&thread, &attr, thread_func, NULL);// 销毁属性对象pthread_attr_destroy(&attr);// 主线程继续工作printf("Main thread done.\n");pthread_exit(NULL);
      }
      
    • 分离状态线程无需 pthread_join,系统自动回收线程资源。
       
    • 非分离状态:
      #include <pthread.h>
      #include <stdio.h>
      #include <unistd.h>void* thread_func(void* arg) {printf("Joinable thread running...\n");sleep(2); // 模拟工作printf("Joinable thread exiting...\n");pthread_exit((void*)42); // 返回值
      }int main() {pthread_t thread;void* retval;// 创建线程pthread_create(&thread, NULL, thread_func, NULL);// 等待线程完成并获取返回值pthread_join(thread, &retval);printf("Thread exited with code %ld\n", (long)retval);return 0;
      }
      
    • 非分离状态线程需要调用 pthread_join,否则可能导致资源泄漏。

    • 5. 注意事项

    • 不要混用:

      • 对于分离状态的线程,不要再调用 pthread_join,这会导致未定义行为。
      • 同样,不分离的线程也需要显式调用 pthread_join,否则会泄漏资源。
    • 选择合适状态:

      • 如果不需要线程返回值,且不关心线程完成时机,可以选择分离状态。
      • 如果需要获取线程返回值或需要确保线程完成,可以使用默认的非分离状态。

    • 结论

      设置分离状态简化了线程管理,但丢失了对线程返回值的控制。具体选择取决于应用场景需求。

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

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

相关文章

微前端qiankun的基本使用(vue-element-admin作为项目模版)

微前端qiankun的基本使用(vue-element-admin作为项目模版) qiankun架构特点主应用netmoni_master改造工程项目目录结构子项目配置:子应用注册配置项container:子应用挂载节点配置项activeRule:子应用路由子应用netmoni_child1改造目录结构项目配置:src/settings中配置子应…

使用PHP函数 “is_object“ 检查变量是否为对象类型

在PHP中&#xff0c;变量可以保存不同类型的值&#xff0c;包括整数、字符串、数组、布尔值等等。其中&#xff0c;对象是一种特殊的数据类型&#xff0c;用于封装数据和方法。在处理PHP代码中&#xff0c;我们经常需要检查一个变量是否为对象类型&#xff0c;以便进行相应的处…

DAY3,模拟终端

题目 实现一个终端的功能&#xff0c;注意需要带有cd功能 思路 如何 C语言执行shell命令&#xff1f; 使用进程替换exec函数&#xff1b;&#xff1b;使用system函数。 如何 切换工作目录&#xff1f; 使用chdir函数切换工作目录。 其…

一键视频转文字/音频转文字,浏览器右键提取B站视频文案,不限时长免费无限次可用

上篇文章阿虚分享了自己的「短视频」笔记方案 短视频文件小&#xff0c;易存储&#xff0c;所以阿虚建议是直接将原视频插入到笔记当中 而长视频文件大&#xff0c;很难像短视频一样操作。阿虚之前的建议是提取重要部分视频转长截图&#xff0c;或者视频转GIF 但上述方案仔细…

【C++】详细讲解继承(上)

C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。现在我们就介绍一下继承。 1.继承的概念及定义 1.1 继承的概念 继承机制是⾯向对象程序设计使代码可以 复⽤ 的最重要的⼿段。我们前面接触到的都是 函数 层次的复用&#xff0c;遇到过的 类 层次的复…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储

文章目录 前言一、数据采集步骤及python库使用版本1. python库使用版本2. 数据采集步骤 二、数据采集网页分析1. 分析采集的字段和URL1.1 分析要爬取的数据字段1.2 分析每部电影的URL1.2 分析每页的URL 2. 字段元素标签定位 三、数据采集代码实现1. 爬取1905电影网分类信息2. 爬…

【25】Word:林涵-科普文章❗

目录 题目​ NO1.2.3 NO4.5.6 NO7.8 NO9.10 NO11.12 不连续选择&#xff1a;按住ctrl按键&#xff0c;不连续选择连续选择&#xff1a;按住shift按键&#xff0c;选择第一个&#xff0c;选择最后一个。中间部分全部被选择 题目 NO1.2.3 布局→纸张方向&#xff1a;横向…

C语言二级

//请编写函数fun()&#xff0c;该函数的功能是&#xff1a;计算并输出给定整数n的所有因 //子&#xff08;不包括1和自身&#xff09;之和。规定n的值不大于1000。例如&#xff0c;在主函数 //中从键盘给n输入的值为856&#xff0c;则输出为&#xff1a;sum 763。 //注意&…

P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境&#xff1a;Python 3.8.12 编译器&#xff1a;jupyter notebook 深度学习环境&#xff1a;torch 1.12.0cu113 一、前期准备 1.设置GPU im…

Mac下安装ADB环境的三种方式

参考网址&#xff1a; Mac下安装ADB环境的三种方式-百度开发者中心 ADB&#xff0c;即Android Debug Bridge&#xff0c;是Android开发过程中不可或缺的工具。通过ADB&#xff0c;开发者可以在计算机上管理设备或模拟器上的应用&#xff0c;提供了丰富的调试功能。然而&#…

WordPress Fancy Product Designer插件Sql注入漏洞复现(CVE-2024-51818)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…

web速览

web速览 1. 前端开发 概述&#xff1a; 前端开发是构建网站用户界面的过程&#xff0c;主要关注网站的视觉效果和用户体验。又称为客户端 技术栈&#xff1a; HTML&#xff08;超文本标记语言&#xff09;&#xff1a;用于创建网页的结构和内容。CSS&#xff08;层叠样式表&a…

PHP常见正则表达式

一、校验数字的表达式 1 数字&#xff1a;^[0-9]*$ 2 n位的数字&#xff1a;^\d{n}$ 3 至少n位的数字&#xff1a;^\d{n,}$ 4 m-n位的数字&#xff1a;^\d{m,n}$ 5 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字&#xff1a;^([1-9][0-…

0164__【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os

【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os_gcc -o0-CSDN博客

【Rust自学】14.4. 发布crate到crates.io

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.4.1. 创建并设置crates.io账号 在发布任何 crate 之前&#xff0c;你需要在 crates.io并…

青少年编程与数学 02-007 PostgreSQL数据库应用 15课题、备份与还原

青少年编程与数学 02-007 PostgreSQL数据库应用 15课题、备份与还原 一、数据库备份与还原二、PostgreSQL中操作数据库的备份与还原1. 使用pg_dump进行逻辑备份2. 使用pg_restore进行逻辑还原3. 使用pg_basebackup进行物理备份4. 还原物理备份注意事项 三、自动备份1. 使用pg_d…

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

IBM湖仓一体与向量数据库:访问MinIO控制台(Accessing the MinIO console)

_1、从密钥中复制S3凭证并保存 &#xff08;Copy the S3 credentials from the secret and save it &#xff09; oc extract secret/ibm-lh-config-secret -n ${PROJECT_CPD_INST_OPERANDS} --to- --keysenv.properties | grep -E "LH_S3_ACCESS_KEY|LH_S3_SECRET_KEY&q…

STM32 低功耗设计:从原理到实现的详细介绍

在现代嵌入式系统中&#xff0c;尤其是在需要长时间工作且电池供电的设备中&#xff0c;低功耗设计至关重要。STM32作为一种流行的微控制器系列&#xff0c;广泛应用于便携设备、传感器网络、可穿戴设备等领域&#xff0c;提供了多种低功耗模式来延长电池使用时间并优化整体能效…