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.rhkb.cn/news/6487.html

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

相关文章

HMV Challenges 022 Writeup

题目地址&#xff1a;https://hackmyvm.eu/challenges/challenge.php?c022 首先猜测是否为图片隐写&#xff0c;无果 盲猜图片上的小鸟是某种带符号的隐写 去这个网站找找看&#xff1a;https://www.dcode.fr/chiffres-symboles 找到了 参照原图片鸟儿的姿态选择并排放 所…

FPGA与ASIC:深度解析与职业选择

IC&#xff08;集成电路&#xff09;行业涵盖广泛&#xff0c;涉及数字、模拟等不同研究方向&#xff0c;以及设计、制造、封测等不同产业环节。其中&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;和ASIC&#xff08;专用集成电路&#xff09;是两种重要的芯片类型…

【前端】Hexo 建站指南

文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了&#xff0c;想要分享给同学们一起交流进步&#xff0c;该怎么办&#xff1f;想要搭建一个属于自己的知识库…

抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目

写这篇文章的初衷并不是要大家真的不用node和vscode&#xff0c;说实话前端发展成今天这样&#xff0c;在实际开发中确实离不开node和vscode这类工具了&#xff0c;但往往工具用多了我们自己也成了一个工具人&#xff01; 这篇文章的缘由 最近在开发wordpress插件的时候&…

Gin 学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1FV4y1C72M?spm_id_from333.788.videopod.sections&vd_source707ec8983cc32e6e065d5496a7f79ee6 01-项目搭建 各常用目录的说明&#xff1a; https://github.com/golang-standards/project-layout/blob/master/REA…

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先&#xff0c;它是保障网络安全的关键防线&#xff0c;通过设置访问控制规则&#xff0c;可精准过滤非法网络流量&#xff0c;有效阻挡外部黑客攻击、恶…

双目立体校正和Q矩阵

立体校正 对两个摄像机的图像平面重投影&#xff0c;使二者位于同一平面&#xff0c;而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R&#xff0c;T) 从上图中可以看出&#xff0c;该算法主要分为两步&#xff1a; 使成像平面共面 这个办法很直观&#xff…

【C++】string类模拟实现

目录 &#x1f495;1.模拟string类构造函数 &#x1f495;2.模拟构造函数实现 &#x1f495;3.拷贝构造函数模拟实现 &#x1f495;4.析构函数模拟实现 &#x1f495;5.size函数&#xff0c;capacity函数模拟实现 &#x1f495;6.begin函数,end函数&#xff0c;模拟实…

微调Qwen2:7B模型,加入未知信息语料

对于QWen2这样的模型,在微调的时候,语料的投喂格式满足ChatML这样的格式!!! OpenAI - ChatML: 下面是ChatML格式的介绍: https://github.com/openai/openai-python/blob/release-v0.28.0/chatml.mdhttps://github.com/openai/openai-python/blob/release-v0.28.0/chat…

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

HTML根元素<html>的语言属性lang:<html lang=“en“>

诸神缄默不语-个人CSDN博文目录 在编写HTML页面时&#xff0c;通常会看到<html lang"en">这行代码&#xff0c;特别是在网页的开头部分&#xff0c;就在<!DOCTYPE html>后面。许多开发者可能对这个属性的含义不太了解&#xff0c;它到底有什么作用&…

小样本学习中的Prototypical Network(原型网络)详解

Few-shot Learning ,即“小样本学习”,是一种机器学习方法,旨在通过极少量样本训练模型,使其能够快速适应新任务或新类别。这种方法在数据稀缺的场景中非常有用。 Prototypical Network(原型网络)是小样本学习中的经典方法之一,特别适用于分类任务。它的核心思想是通过学…

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…

Springboot3 自动装配流程与核心文件:imports文件

注&#xff1a;本文以spring-boot v3.4.1源码为基础&#xff0c;梳理spring-boot应用启动流程、分析自动装配的原理 如果对spring-boot2自动装配有兴趣&#xff0c;可以看看我另一篇文章&#xff1a; Springboot2 自动装配之spring-autoconfigure-metadata.properties和spring…

JVM面试题解,垃圾回收之“分代回收理论”剖析

一、什么是分代回收 我们会把堆内存中的对象间隔一段时间做一次GC&#xff08;即垃圾回收&#xff09;&#xff0c;但是堆内存很大一块&#xff0c;内存布局分为新生代和老年代、其对象的特点不一样&#xff0c;所以回收的策略也应该各不相同 对于“刚出生”的新对象&#xf…

“腾讯、钉钉、飞书” 会议开源平替,免费功能强大

在数字化时代&#xff0c;远程办公和线上协作越来越火。然而&#xff0c;市面上的视频会议工具要么贵得离谱&#xff0c;要么功能受限&#xff0c;甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet&#xff0c;这可是我在网…

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…

状态模式——C++实现

目录 1. 状态模式简介 2. 代码示例 3. 单例状态对象 4. 状态模式与策略模式的辨析 1. 状态模式简介 状态模式是一种行为型模式。 状态模式的定义&#xff1a;状态模式允许对象在内部状态改变时改变它的行为&#xff0c;对象看起来好像修改了它的类。 通俗的说就是一个对象…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…