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

勇敢的劳尤条

 
 
 

日志

 
 

父线程退出了,子线程还活着吗?  

2013-12-11 10:24:37|  分类: 其他资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最开始遇到的并不是这个疑问,而是由其他问题联系上来的。

1. 在一个函数中创建了线程,那么函数返回时,线程会退出吗?

2. 主线程创建了线程1,线程1创建了线程2,那么线程1退出的时候,线程2会跟着结束吗?

3.主线程退出了,所有的线程都会结束,这是为什么呢?

带着这些疑问,做了测试代码,答案后面揭晓(只能说我是菜鸟,理论知识完全不过关)。

#include <iostream>
#include<pthread.h>
using namespace std;
void fuck();
void*lala(void*arg);
void*lala2(void*arg);
int main()
{
    fuck();
    while(1)
    {
        cout<<"main thread is running"<<endl;
        sleep(1);
    }
    return 0;
}
void fuck()
{
    pthread_t ptid;
    pthread_create(&ptid,NULL,lala,NULL);
    pthread_join(ptid,NULL);
}
void*lala(void*arg)
{
    while(1)
    {
        cout<<"thread 1 is running"<<endl;
        sleep(1);
    }
    pthread_t ptid;
    pthread_create(&ptid,NULL,lala2,NULL);
    return NULL;
}
void*lala2(void*arg)
{
    while(1)
    {
        cout<<"thread 2 is running"<<endl;
        sleep(1);
    }
    return NULL;
}

对于疑问1:上面的代码中,函数fuck()里面创建了线程lala,fuck返回后,主线程和lala线程一起运行。所以,函数退出,创建的线程仍然存在。
对于疑问2:上面代码中,把lala的while循环去掉,线程lala创建了线程lala2,然后线程lala就结束了,而程序运行结果是主线程和lala2同时运行。所以父线程退出了,子线程并不会退出。
对于疑问3:OS/2有一个所谓的主线程的概念,一旦主线程死掉,整个进程就死掉了,当然,隶属于该进程的所有线程也被干掉。
那么这些现象的原因是什么呢?http://bbs.csdn.net/topics/40013383
首先,线程分为两种,用户级线程(user level thread,ULT),内核级线程(kernel level thread,KLT)
对于用户级线程,内核没有关于线程的概念,只有进程,因此,所有的父子进程都会在同一时刻退出。
      在posix里,没有父子进程这个概念。如果使用过 fork() 系统调用,可能熟悉父进程和子进程的概念。当用fork()创建另一个新进程时,新进程是子进程,原始进程是父进程。这创建了可能非常有用的层次关系,尤其是等待子进程终止时。例如,waitpid()函数让当前进程等待所有子进程终止。waitpid()用来在父进程中实现简单的清理过程。
而 POSIX 线程就更有意思。您可能已经注意到我一直有意避免使用“父线程”和“子线程”的说法。这是因为 POSIX 线程中不存在这种层次关系。虽然主线程可以创建一个新线程,新线程可以创建另一个新线程,POSIX 线程标准将它们视为等同的层次。所以等待子线程退出的概念在这里没有意义。POSIX 线程标准不记录任何“家族”信息。缺少家族信息有一个主要含意:如果要等待一个线程终止,就必须将线程的 tid 传递给 pthread_join()。线程库无法为您断定 tid。

           线程是指程序的执行线索,本身没有父子关系,就算是用户级线程,也没有,用户级线程的实现一般是靠线程库来实现的。你调用了该线程库提供的终止线程的操作,一般不会引起别的线程被干掉,因为系统其实不知道发生了这样子的事情。但是用户级线程会有一个弊端,一旦一个线程被阻塞,整个程序(进程)就被阻塞了。用户级线程的优势是调度性能非常高,也就是说,线程切换基本没有开销。
          对于核心级线程,一个死掉并不会导致另一个死掉。但是OS/2有一个所谓的主线程的概念,一旦主线程死掉,整个进程就死掉了,当然,隶属于该进程的所有线程也被干掉。核心级的线程和用户级的线程的优缺点正好相反。线程概念上就没有父子之分,它只是被创造出来的一个执行线索。按照WindowsNT的概念,进程仅仅是一个容器,是一个执行环境,真正的执行都是线程。所以,线程一定是由线程创建的。如果创建者死了,被创建者也得死的话,你可以设想一下,你的程序很多东西都会崩溃。

  评论这张
 
阅读(597)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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