简单来说: pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收。pthread_join()即是子线程合入主线程,主线程阻塞等待子线程结束,然后回收子线程资源。
【转】在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该要么被显示地回收,即调用pthread_join;要么通过调用pthread_detach函数被分离。
[cpp]
int pthread_join(pthread_t tid, void**thread_return); 
若成功则返回0,若出错则为非零。 
int pthread_join(pthread_t tid, void**thread_return);
若成功则返回0,若出错则为非零。    线程通过调用pthread_join函数等待其他线程终止。pthread_join函数分阻塞,直到线程tid终止,将线程例程返回的(void*)指针赋值为thread_return指向的位置,然后回收已终止线程占用的所有存储器资源。[cpp] view plaincopyprint?int pthread_detach(pthread_t tid); 
若成功则返回0,若出错则为非零。 
int pthread_detach(pthread_t tid);
若成功则返回0,若出错则为非零。
pthread_detach用于分离可结合线程tid。线程能够通过以pthread_self()为参数的pthread_detach调用来分离它们自己。
如果一个可结合线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收,所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。
由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。例如,在Web服务器中当主线程为每个新来的连接请求创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的连接请求),这时可以在子线程中加入代码
pthread_detach(pthread_self())
或者父线程调用
pthread_detach(thread_id)(非阻塞,可立即返回)
这将该子线程的状态设置为分离的(detached),如此一来,该线程运行结束后会自动释放所有资源。

转载于:https://www.cnblogs.com/mcy0808/p/7466614.html

pthread_detach()与pthread_join的区别?相关推荐

  1. LINUX - pthread_detach()与pthread_join()

    pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收. int pthread_join(pthread_t tid, void **thread_return);{suc ...

  2. linux中pthread_join()与pthread_detach()详解

    前言: 1.linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_e ...

  3. pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收

    https://github.com/Rtoax/test/tree/master/c/glibc/pthread 目录 前言 pthread_join() pthread_detach() 前言 1 ...

  4. 【彻底弄懂】linux中pthread_detach()的作用

    文章目录 linux中pthread_detach()解析 linux中pthread_detach()解析 使用pthread_create创建的线程有两种状态:joinable和unjoinabl ...

  5. 后端知识点链接(二):操作系统、Linux

    操作系统 2.5w字 + 36 张图爆肝操作系统面试题,太牛逼了! 32位系统和64位系统有什么区别?C++中32位和64位有什么区别?(同花顺提前批) 计算机基础----32位操作系统和64位操作系 ...

  6. LINUX线程及线程间通信

    线程概念 什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB(进程控制块PCB(Process Contro ...

  7. Linux之线程Thread小结

    文章目录 线程相关操作函数 pthread_create 创建新新程 获取线程ID 线程终止 线程等待 分离线程 线程同步 互斥锁 条件变量 读写锁 信号量 线程私有数据 线程属性 属性操作函数 线程 ...

  8. Linux 多线程多进程

    一.线程初级 1.1 线程基础函数 对象 操作 Linux Pthread API Windows SDK 库对应 API 线程 创建 pthread_create CreateThread 退出 p ...

  9. Unix系统 - 进程管理

    写在前面:注意,本章除了讲解进程管理,还包含网络编程Socket API的知识. 这里写目录标题 一.进程 1.1基础知识 1.1.1进程ID 1.1.2查看进程 1.1.2 父子进程概念 1.1.3 ...

  10. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

最新文章

  1. 智能卡电子钱包应用密钥体系
  2. XTU 1250 Super Fast Fourier Transform
  3. Not using the local TSLint version found for XXX
  4. 5单个编译总会编译全部_JDBC【5】 JDBC预编译和拼接Sql对比
  5. 全栈工程师已经过时?
  6. vb.net 判断是否为ip 正则_什么是个人IP科学定位?标准答案来了|ip|直播|科学|ip魔方...
  7. 转:Java NIO系列教程(二) Channel
  8. fakeroot: preload library `libfakeroot.so' not found, aborting.
  9. QCC304x系列开发教程(实战篇) 之7.2 QCC3040之主副耳切换过程详解
  10. 数据分析案例:超市数据分析
  11. [BUUCTF]PWN——[BJDCTF 2nd]snake_dyn
  12. 如何检查浏览器存储中个人证书的存在
  13. 自我激励的100种方法
  14. python学多久可以接单-详解 | Python学多久才能独立接单赚钱?一个月足够了!
  15. Word教程-给10以上的数字加个圈圈!
  16. C++的内存机制,程序变成exe执行的过程
  17. 一款发动机爆震检测分析仪解决方案:英国 phormula 爆震检测分析仪+PICO
  18. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理
  19. 微信私域流量社群搭建sop流程步骤运营管理方案计划书表格
  20. sklearn之LASSO算法应用

热门文章

  1. Ps 初学者教程,如何让照片成为手绘美图?
  2. 教你几招Mac的省电小技巧
  3. tf.nn.conv2d。卷积函数
  4. 老男孩Linux运维第41期20170827开班第一周学习重点记录
  5. avrdude: stk500_getsync(): not in sync: resp=0x00
  6. Mac 移动端http、https抓包之Charles
  7. CSDN - 屏蔽百度广告
  8. Spring Boot + WebMagic 实现网页爬虫,写得太好了!
  9. 记一次生产环境存储过程优化的过程(42秒--0.06秒)
  10. 4分钟看尽Top编程语言15年沉浮:C#默Java泪,Python终上位!