pthread_detach(pthread_t thread)

POSIX线程库的API中有分离线程的API:

       #include <pthread.h>

        int pthread_detach(pthread_t thread);

       int pthread_attr_setdetachstate (pthread_attr_t *__attr,

                                        int __detachstate)

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

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

void reap_zombie(int signo)

{

         int errno_old = errno;

         while (waitpid(-1, NULL, WNOHANG) > 0)

                 ;

         errno = errno_old;

}

如果只是为了为子进程“收尸”,以上代码足矣!另一方面,如果父进程对子进程的终止状态没有任何兴趣,那么以上代码无疑又会引入无谓的复杂度,并且还有潜在的同步瓶颈。如果进程能够像处于分离状态的线程那样死得干干净净,那就完美了!

POSIX标准为我们考虑地可谓十分周到,下面是sigaction(2)的手册页中的一段话:

       POSIX.1-1990 disallowed setting the action for SIGCHLD to SIG_IGN. POSIX.1-2001 allows this possibility,

       so that ignoring SIGCHLD can be used to prevent the creation of zombies (see wait(2)). Nevertheless, the

       historical BSD and System V behaviours for ignoring SIGCHLD differ, so that the only completely portable

       method of ensuring that terminated children do not become zombies is to catch the SIGCHLD signal and per-

       form a wait(2) or similar.

从中我们可以得知POSIX.1-2001允许将SIGCHLD的信号处理函数设置为SIG_IGN,这时子进程退出的时候将不会进入僵尸状态,并且它所占用的系统资源将被操作系统自动回收:

signal(SIGCHLD, SIG_IGN);

除此之外,你还可以通过将sigaction调用中的flags与上SA_NOCLDWAIT来分离子进程:

                        struct sigaction act;

                         memset(&act, 0, sizeof(act));

                         act.sa_flags |= SA_NOCLDWAIT;

                         sigaction(SIGCHLD, &act, NULL);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值