Linux 线程的分离与结合

在开始线程部分内容前,我想还是先把这个概念抛出来,否则在开始《线程的创建&属性》中会有部分内容不太清楚。

原理简述:

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。

  • 一个可结合的线程能够被其他线程回收其资源和杀死,在被其他线程回收之前,他的存储器资源是不释放的;
  • 一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的。在这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。

而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。

线程分离状态的设置:

设置线程分离状态的函数为pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和PTHREAD_CREATE_JOINABLE(非分离线程)

  • 这里需要注意的一点是:如果设置一个线程为分离线程,而这个线程又运行的非常快,它很可能在pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方式就是在被创建的线程中调用pthread_cond_timewait函数,让这个线程等待一会,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程中常用的方法。
  • 但是注意不要使用诸如wait()之类的函数,它们使整个进程睡眠,并不能解决线程同步的问题。

线程属性设置的注意事项:

如果线程处于joinable状态,则只能被创建它的线程等待终止。(这里涉及到资源释放)

通过调用pthread_join来获取另一个线程的终止状态并且释放该线程所占的资源。

创建detach线程:

1.      pthread_t tid;

2.      pthread_attr_t attr;

3.      pthread_attr_init(&attr);//初始化

4.      pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//进行设置

5.      pthread_creat(&tid,&attr, void (*function)(void *), void *arg);//创建一个以分离属性启动的线程

在使用线程时避免线程的资源在线程结束时不能得到正确的释放,从而产生潜在内存泄露问题,在等待线程结束时,要确保该线程处于detached状态,否则就需要调用pthread_join()函数来对其进行资源回收。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值