登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

白杨

坚持是一种品质,用心是一种习惯! 生活仍在继续……追逐编程质量与效率

 
 
 

日志

 
 

多线程编程指南学习笔记 (五)--线程分离  

2012-10-26 16:27:23|  分类: 多线程编程指南学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

有关线程的分离状态的详细介绍,请参看《线程的分离状态》。

pthread_detach (3C) 是pthread_join (3C) 的替代函数,可回收创建时detachstate 属性设置为PTHREAD_CREATE_JOINABLE的线程的存储空间。

int pthread_detach(thread_t tid);

返回值:
pthread_detach() 在调用成功完成之后返回零。其他任何返回值都表示出现了错误。如果检测到以下任一情况,pthread_detach() 将失败并返回相应的值。
EINVAL: tid是分离线程。
ESRCH: tid不是当前进程中有效的未分离的线程。

我们知道,创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符。只有当你调用了pthread_join之后这些资源才会被释放。即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,有时我们并不希望如此(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码

pthread_detach(pthread_self()) 

或者父线程调用

pthread_detach(thread_id)  //(非阻塞,可立即返回)

这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。

pthread_detach(threadid)和pthread_detach(pthread_self())的区别应该是调用他们的线程不同,没其他区别。pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态,一旦线程处于分离状态,该线程终止时底层资源立即被回收;否则终止子线程的状态会一直保存(占用系统资源)直到主线程调用pthread_join(threadid,NULL)获取线程的退出状态。通常是主线程使用pthread_create()创建子线程以后,一般可以调用pthread_detach(threadid)分离刚刚创建的子线程,这里的threadid是指子线程的threadid;如此以来,该子线程止时底层资源立即被回收;
被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己,因为pthread_self()这个函数返回的就是自己本身的线程ID。

函数原型:pthread_t pthread_self(void);

函数作用:获得线程自身的ID。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则将产生奇怪的结果。

  评论这张
 
阅读(1242)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018