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


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

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

    起因:

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

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

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

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

    /*************************************************************************
            > 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
    ");
    }
    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
    ");
            exit(0);
        }
        printf("printf form main
    ");
        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
    ");
    }       
    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
    ");
            exit(0);
        }                                                                                                                                                                                  
        printf("printf form main
    ");
        return 0;
    }    
    分离线程

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

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

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

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

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

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

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

    那么我们应该怎么办呢?

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

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

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

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

  • 相关阅读:
    JQuery对象操作支持链式法则源码分析
    JQuery + JSON作为前后台数据交换格式实践
    JQuery html API支持解析执行Javascript脚本功能实现-代码分析
    跨域访问实践
    XP下安装MAC OS虚拟系统
    Android APP开发笔记
    CSS浮动与清浮动
    LUA 模块化编程例子
    JavaScript解决命名冲突的一种方法
    XML中文本节点存储任意字符的方法
  • 原文地址:https://www.cnblogs.com/likeyiyy/p/3670146.html
Copyright © 2020-2023  润新知