http://blog.csdn.net/seucbh84/article/details/12649267###;

linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,

如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。

unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join.

其实简单的说就是在线程函数头加上 pthread_detach(pthread_self())的话,线程状态改变,在函数尾部直接 pthread_exit线程就会自动退出。省去了给线程擦屁股的麻烦.

http://blog.csdn.net/china_hearts/article/details/4776930

线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性,一般是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。

讲到分离线程,先得从僵尸进程讲起(抱歉,确实不知道线程是否有僵尸一说)。

关于僵尸进程:一般情况下进程终止的时候,和它相关的系统资源也并不是主动释放的,而是进入一种通常称为“僵尸”(zombie)的状态。它所占有 的资源一直被系统保留,直到它的父进程(如果它直接的父进程先于它去世,那么它将被init进程所收养,这个时候init就是它的父进程)显式地调用 wait系列函数为其“收尸”。为了让父进程尽快知道它去世的消息,它会在它死去的时候通过向父进程发送SIGCHLD信号的方式向其“报丧”。

所以一旦父进程长期运行,而又没有显示wait或者waitpid,同时也没处理SIGCHLD信号,这个时候init进程,就没办法来替子进程来收尸。这个时候,子进程就真的成了”僵尸“了。

同理:

如果一个线程调用了这个函数,那么当这个线程终止的时候,和它相关的系统资源将被自动释放,系统不用也不能用pthread_join()等待其退 出。有的时候分离线程更好些,因为它潜在地减少了一个线程回收的同步点,并且pthread_join()这个API确实也是相当地难用。

为了让主线程省去去子线程收尸的过程,可以使用

int pthread_detach(pthread_t thread);(线程内部使用,从joinable变为unjoinable)

http://blog.csdn.net/hudashi/article/details/7709413

Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。

pthread_attr_t的主要属性的意义如下:
__detachstate ,表示新线程是否与进程中其他线程脱离同步,  如果设置为 PTHREAD_CREATE_DETACHED  则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为 PTHREAD_CREATE_JOINABLE 状态。这个属性也可以在线程创建并运行以后用 pthread_detach() 来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
__schedpolicy ,表示新线程的调度策略,主要包括 SCHED_OTHER (正常、非实时)、 SCHED_RR (实时、轮转法)和 SCHED_FIFO (实时、先入先出)三种,缺省为 SCHED_OTHER ,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
__schedparam ,一个 struct sched_param 结构,目前仅有一个 sched_priority 整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为 0 。
__inheritsched ,有两种值可供选择: PTHREAD_EXPLICIT_SCHED 和 PTHREAD_INHERIT_SCHED ,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为 PTHREAD_EXPLICIT_SCHED 。
__scope ,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值: PTHREAD_SCOPE_SYSTEM 和 PTHREAD_SCOPE_PROCESS ,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了 PTHREAD_SCOPE_SYSTEM 一值。
为了设置这些属性,POSIX定义了一系列属性设置函数,包括 pthread_attr_init()、 pthread_attr_destroy()和与各个属性相关的 pthread_attr_get XXX/ pthread_attr_set XXX函数。
在设置线程属性  pthread_attr_t 之前,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。
主要的函数如下:
1、pthread_attr_init
功能:        对线程属性变量的初始化。
头文件:     <pthread.h>
函数原型:   int pthread_attr_init (pthread_attr_t* attr);
函数传入值:attr:线程属性。
函数返回值:成功: 0
失败: -1
2、pthread_attr_setscope
功能:         设置线程  __scope  属性。scope属性表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值: PTHREAD_SCOPE_SYSTEM 和 PTHREAD_SCOPE_PROCESS ,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。 目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
头文件:     <pthread.h>
函数原型:    int  pthread_attr_setscope  (pthread_attr_t* attr, int scope);
函数传入值:attr: 线程属性。
scope: PTHREAD_SCOPE_SYSTEM, 表示与系统中所有线程一起竞争CPU时间,
PTHREAD_SCOPE_PROCESS,表 示仅与同进程中的线程竞争CPU
函数返回值得:同1。
3、pthread_attr_setdetachstate
功能:         设置线程 detachstate 属性。该表示新线程是否与进程中其他线程脱离同步,如果设置为 PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为 PTHREAD_CREATE_JOINABLE 状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
头文件:      <phread.h>
函数原型:     int  pthread_attr_setdetachstate  (pthread_attr_t* attr, int detachstate);
函数传入值:attr:线程属性。
detachstate: PTHREAD_CREATE_DETACHED, 不能用pthread_join()来同步,且在退出时自行释放所占用的资源
PTHREAD_CREATE_JOINABLE, 能用pthread_join()来同步
函数返回值得:同1。
4、pthread_attr_setschedparam
功能:       设置线程 schedparam 属性,即调用的优先级。
头文件:     <pthread.h>
函数原型:   i nt  pthread_attr_setschedparam  (pthread_attr_t* attr, struct sched_param* param);
函数传入值:attr:线程属性。
param:线程优先级。 一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0
函数返回值:同1。
5、pthread_attr_getschedparam
功能:       得到线程优先级。
头文件:    <pthread.h>
函数原型:   int  pthread_attr_getschedparam  (pthread_attr_t* attr, struct sched_param* param);
函数传入值:attr:线程属性;
param:线程优先级;
函数返回值:同1。
示例1
#include <stdlib.h>   
#include <stdio.h>   
#include <errno.h>   
#include <pthread.h>   
static void pthread_func_1 ( void );   
static void pthread_func_2 ( void );   
  
int main ( int argc , char ** argv )   
{   
  pthread_t pt_1 = 0 ;   
  pthread_t pt_2 = 0 ;   
  pthread_attr_t atrr = { 0 };   
  int ret = 0 ;   
  

/*初始化属性线程属性*/

  pthread_attr_init (& attr );   
  pthread_attr_setscope (& attr , PTHREAD_SCOPE_SYSTEM );   
  pthread_attr_setdetachstate (& attr , PTHREAD_CREATE_DETACHED );   
     
  ret = pthread_create (& pt_1 , & attr , pthread_func_1 , NULL );   
  if ( ret != 0 )   
  {   
    perror ( "pthread_1_create" );   
  }   
     
  ret = pthread_create (& pt_2 , NULL , pthread_func_2 , NULL );   
  if ( ret != 0 )   
  {   
    perror ( "pthread_2_create" );   
  }   
  
  pthread_join ( pt_2 , NULL );   
  
  return 0 ;   
}   
  
static void pthread_func_1 ( void )   
{   
  int i = 0 ;   
     
  for (; i < 6 ; i ++)   
  {    
    printf ( "This is pthread_1.\n" );   
      
    if ( i == 2 )   
    {   
      pthread_exit ( 0 );   
    }   
  }   
  
  return ;   
}   
  
static void pthread_func_2 ( void )   
{   
  int i = 0 ;   
  
  for (; i < 3 ; i ++)   
  {   
    printf ( "This is pthread_2.\n" );   
  }   
  
  return ;   
}  
从上面事例中,可以得到这么一个结果,就是线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源。

线程分离pthread_detach、pthread_attr_setdetachstate (attr, PTHREAD_CREATE_DETACHED);相关推荐

  1. Linux学习之系统编程篇:实现线程分离

    函数: int pthread_detach(pthread_t thread); // 参数:线程 ID 最大特点: (1)子进程会自己回收 PCB,因此调用该函数之后,不需要调用 pthread_ ...

  2. 线程分离属性,线程取消(状态,类型),线程取消例程函数

    目录 1.线程分离属性 2.线程取消(状态,类型) 3.线程取消例程函数 1.线程分离属性 默认情况下,线程启动后处于可接合状态(即未分离),此时的线程可以在退出时让其他线程接合以便释放资源,但若其他 ...

  3. Linux c 线程分离(两种方法实现线程分离)

    文章目录 1.使用函数实现线程分离 2.通过属性实现线程分离 3.杀死线程函数 1.使用函数实现线程分离 // 创建线程 int pthread_create(pthread_t &tid,c ...

  4. Linux系统编程---14(回收子线程,回收多个子线程,线程分离,杀死线程)

    回收子线程 pthread_join 函数 阻塞等待线程退出,获取线程退出状态 其作用,对应进程中 waitpid() 函数. int pthread_join (pthread_t thread,v ...

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

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

  6. linux c 线程的创建、线程等待、线程终止、线程分离

    1. 什么是线程   线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流:内部本质上是多个线程在同一个地址空间运行:第一个pcb称之为主线程:有多个线程就有多个执行流:一个进程至少有一个 ...

  7. Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)

    文章目录 1.线程的定义,进程和线程的关系 2.Linux下的线程 Linux原生线程库(pthread库pthread.h) 线程的优点 线程的私有数据 3.线程控制 ①创建线程(pthread_c ...

  8. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

  9. 2022-2-1 牛客C++项目 —— 线程分离

    /* #include <pthread.h> int pthread_detach(pthread_t thread); 功能:分离一个线程.被分离的线程在终止的时候,会自动释放资源给系 ...

最新文章

  1. 一文运维zookeeper
  2. mysql limit 限制查询记录数
  3. 服务器开好服怎么和网站连,vps开服连服务器没反应
  4. CShockwaveFlash 函数列表
  5. nssl1318-地铁重组【dp】
  6. python 判断每月最后一天_python获取某年中每个月的第一天和最后一天的两种方法...
  7. c/c++多线程编程中最好不要加volatile
  8. 预备作业03 20162316刘诚昊
  9. arm linux系统启动流程
  10. android发送短信界面,android调用系统发送短信 和 已发送短信界面
  11. 全国计算机等级考试准考证下载 怎么弄
  12. 050 XSS通关小游戏——xss challenge
  13. 学计算机需要自控力,上班族,自控力差,怎样才能静下心好好学习?
  14. 东方已渐白。一枕清欢更待何人说
  15. 峰哥朋友送30本书!
  16. csdn查看自己收藏的文章
  17. 海尔小管家1号店嗨购盛典引爆 市场份额稳居红星美凯龙第一
  18. php交易商城项目源代码,PHP源码交易商城网站整站源码(商业运行版)
  19. springboot+基于微信小程序的心理医生系统的设计实现 毕业设计-附源码191610
  20. 数据可视化分析案例:基于Python的2021中国品牌Top100强数据分析

热门文章

  1. 复古传奇服务器维护时间,复古传奇手游刷怪时间
  2. ARCGIS绘制南海图框
  3. ABAP使用LOOP AT ASSIGNING FIELD SYMBOL直接更新内表数据
  4. 股价破300迎新年开门红,投资者们中了苹果的毒?
  5. 渗透测试体系学习——学习寄语
  6. 好用的Web前端开发框架有哪些呢?推荐这9款
  7. 错误信息 Error executing DDL via JDBC Statement 解决办法
  8. 相比传统监控,智慧门店的摄像机有多“能干”
  9. 详解5种网站 静态网站、动态网站、伪静态网站、云计算网站都是什么
  10. ROSGazebo自定义多旋翼无人机仿真——环境搭建和模型建立