LINUX下设置分离状态(Detached State)和未设置分离状态的主要区别在于线 ...

打印 上一主题 下一主题

主题 647|帖子 647|积分 1941

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. 示例代码对比
    • 分离状态:

      1. #include <pthread.h>
      2. #include <stdio.h>
      3. #include <unistd.h>
      4. void* thread_func(void* arg) {
      5.     printf("Detached thread running...\n");
      6.     sleep(2); // 模拟工作
      7.     printf("Detached thread exiting...\n");
      8.     pthread_exit(NULL);
      9. }
      10. int main() {
      11.     pthread_t thread;
      12.     pthread_attr_t attr;
      13.     // 初始化属性
      14.     pthread_attr_init(&attr);
      15.     // 设置分离状态
      16.     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
      17.     // 创建线程
      18.     pthread_create(&thread, &attr, thread_func, NULL);
      19.     // 销毁属性对象
      20.     pthread_attr_destroy(&attr);
      21.     // 主线程继续工作
      22.     printf("Main thread done.\n");
      23.     pthread_exit(NULL);
      24. }
      复制代码
    • 分离状态线程无需 pthread_join,系统主动接纳线程资源。
       
    • 非分离状态:

      1. #include <pthread.h>
      2. #include <stdio.h>
      3. #include <unistd.h>
      4. void* thread_func(void* arg) {
      5.     printf("Joinable thread running...\n");
      6.     sleep(2); // 模拟工作
      7.     printf("Joinable thread exiting...\n");
      8.     pthread_exit((void*)42); // 返回值
      9. }
      10. int main() {
      11.     pthread_t thread;
      12.     void* retval;
      13.     // 创建线程
      14.     pthread_create(&thread, NULL, thread_func, NULL);
      15.     // 等待线程完成并获取返回值
      16.     pthread_join(thread, &retval);
      17.     printf("Thread exited with code %ld\n", (long)retval);
      18.     return 0;
      19. }
      复制代码
    • 非分离状态线程需要调用 pthread_join,否则可能导致资源泄漏。
    •      
      5. 注意事项
    • 不要混用:

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

    • 选择符合状态:

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

    •      
      结论

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表