[多线程学习笔记]线程生命周期

博客和笔记的区别:笔记大概可以写的随意一些,自己能看懂就好,而写博客就不一样了,写博客时会自觉的尝试把一个概念介绍清楚,

这大概很锻炼人的语言组织能力,所以我想,技术人员确实应该多写点博客。

起因:

以前也进行过多线程编程,不过是在原来的代码的基础上,添加一点锁啊什么的,对多线程整个系统的知识了解的不多,

这一次项目真好能用到多线程的知识,正好借这个机会学习一下多线程的知识。

 

线程是有生命周期的,而主线程是特殊的,主线程不但有线程的语义,还有进程的语义。

所以当一个主线程退出时,它不会管其他线程是不是还在运行,所有的线程都被终结了,以前写过这样的代码。

/*************************************************************************
        > File Name: lifecycle.c
        > Author: likeyi
        > Mail: likeyiyy@sina.com
        > Created Time: Thu 17 Apr 2014 09:53:25 AM CST
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * delay_print(void * arg)
{
    sleep(1);
    printf("Hello world\n");
}
int main(int argc,char * argv[])
{
    pthread_t tid;
    int result = pthread_create(&tid,NULL,delay_print,NULL);
    if(result != 0)
    {
        printf("create thread error\n");
        exit(0);
    }
    printf("printf form main\n");
    return 0;
}
主线程退出

结果子线程一直不执行,我还以为一个线程创建后会自己剥离呢,现在我知道不会了。

要想一个线程自己剥离,要么在pthread_create中设置线程属性为可剥离的,要么在进入线程后调用pthread_detach(pthread_self())来分离自己。

/*************************************************************************
    > File Name: lifecycle.c
    > Author: likeyi
    > Mail: likeyiyy@sina.com 
    > Created Time: Thu 17 Apr 2014 09:53:25 AM CST
 ************************************************************************/
        
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
        
void * delay_print(void * arg)
{       
    pthread_detach(pthread_self());
    sleep(1);
    printf("Hello world\n");
}       
int main(int argc,char * argv[])
{       
    pthread_t tid;
    int result = pthread_create(&tid,NULL,delay_print,NULL);
    if(result != 0)
    {   
        printf("create thread error\n");
        exit(0);
    }                                                                                                                                                                                  
    printf("printf form main\n");
    return 0;
}    
分离线程

以上当然只是我想当然的想法,实际上运行时仍然是主线程运行完了就退出了,初始线程退出了,那么整个进程就结束了,不管线程有没有剥离自己。

好吧,这个错误,让我知道我对“分离”的概念可能理解错了。

我心中的分离就是让两个线程不再相关,你结束了,但是我不会因为你的结束而结束。

这是个很好的想法,但是这个想法是错的。

pthread_detach实际上只是和资源回收相关,当一个线程没有分离自己而且结束了,那么它的资源就在那里不会释放,除非有其他线程join它。

但是通常初始线程并不想join它的子线程,所以我们才会用到pthread_detach技术。

上面的那段代码,子线程虽然剥离了自己,但是它仍然没有机会执行。

 

那么我们应该怎么办呢?

1.使用join,使用join将使初始线程阻塞,直到子线程结束。

2.初始线程使用pthread_exit而不是使用return。

 

如果你希望初始线程结束后,子线程继续执行,那么你应该使用pthread_exit而不是return。pthread_detach和这个并没有关系。

pthread_join是有用的,但并不是规则。                                                                                                                                                                                                                                  

 

posted @ 2014-04-17 10:38  李可以  阅读(299)  评论(0编辑  收藏  举报