当前位置: 首页 > article >正文

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.kler.cn/a/514401.html

相关文章:

  • ES6 简单练习笔记--变量申明
  • 基于 WPF 平台使用纯 C# 实现动态处理 json 字符串
  • 安装wxFormBuilder
  • 第3天:阿里巴巴微服务解决方案概览
  • 开篇:吴恩达《机器学习》课程及免费旁听方法
  • 快手SDK接入错误处理经验总结(WebGL方案)
  • 1.21学习
  • Ceisum无人机巡检直播视频投射
  • SpringCloud学习笔记【尚硅谷2024版】
  • 2025年1月19日(舵机VCC)
  • vue3切换路由后页面不报错显示空白,刷新后显示正常
  • 鸿蒙产业学院正式揭牌!软通动力与深信息签署校企合作框架协议
  • Postgresql源码(141)JIT系列分析汇总
  • HDFS的Shell操作
  • 【愚公系列】《微信小程序与云开发从入门到实践》059-迷你商城小程序的开发(加入购物车与创建订单功能开发)
  • c++ 与 Matlab 程序的数据比对
  • 【Docker】 privileged: true:允许容器获得比默认更高的权限
  • JavaScript正则表达式解析:模式、方法与实战案例
  • 基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解
  • 【2024年华为OD机试】 (E卷,200分)-通过软盘拷贝文件(JavaScriptJava PythonC/C++)
  • 使用一行 CSS 去除图像背景
  • el-tree树结构在名称后面添加其他文字
  • 基于Vue的电子商城后台管理系统
  • 【从0带做】基于Springboot3+Vue3的心理健康预约平台
  • 数据库(MySQL)
  • 在 Kubernetes 上快速安装 KubeSphere v4.1.2