linux下的线程的创建退出及回收



1.线程相关的概念:


程序:二进制程序放置在存储媒介中(硬盘,光盘,软盘等)以物理文件形式存在。


进程:程序被触发后,执行者的权限与属性,程序的程序代码与所需数据等都会被加载到内存中,操作系统并给与这个内存内的单元一个标识符(PID),可以说,进程就是一个正在运行中的程序。


线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 


进程和线程的关系:线程是属于进程的,线程运行在进程的空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时改进程所产生的线程会被强制退出并清除,一个进程至少需要一个线程作为它的指令执行体。    进程管理着资源(cpu,内存,文件等)而线程分配到某个cpu 上去执行。


多线程:线程相关的执行状态和存储变量放在线程控制表内。一个进程可以有多个线程,有多个线程控制表及堆栈寄存器,共享一个用户地址空间。

cpu会分配给每一个线程只有极少的运行时间,时间一到就交出运行权,所有线程被快速的切换执行,因为cpu的执行速度非常的快,所以在执行的过程中我们可以简单的认为这些线程是“并发”执行的。


2.线程编程:


线程标识

  线程ID

    •进程ID在整个系统中是唯一的

    •线程ID只在它所属的进程环境中有效

函数: pthread_self()



pthread_t 用于声明线程ID

无符号整数表示

创建线程:

  •调用该线程函数的入口点

  •使用函数pthread_create(),线程创建后,就开始运行相关的线程函数


退出线程

  •在线程函数运行完后,该线程也就退出了

  •或使用函数pthread_exit(),这是线程的主动行为







执行结果:



其中的sleep(1) 这一秒  你可以删除试下,你会发现 不会输出任何东西  ,因为sleep(1)后 是 return 0  相当于 exit(0)进程就直接退出了,线程无法脱离其附属进程,当其附属进程消失,线程也自然会跟着消失。




等待线程


  •由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放


  •pthread_join()函数


    类似进程的wait()/waitpid()函数,用于将当前线程挂起来等待线程的结束

    是一个线程阻塞的函数,调用它的线程一直等待到被等待的线程结束为止

    函数返回时,被等待线程的资源就被收回

  1. #include<stdio.h>  
  2. #include<sys/types.h>  
  3. #include<unistd.h>  
  4. #include<pthread.h>  
  5.   
  6. pthread_t pth1_id,pth2_id;  
  7.   
  8.   
  9. voidvoid *fun1(voidvoid *arg)  
  10. {  
  11.     int i=3;  
  12.     while(i--)  
  13.     {     
  14.     printf("pthread1 is  running \n");  
  15.     sleep(1);  
  16.     }     
  17.     pthread_exit((voidvoid *)1);  
  18.     //return 0;  
  19. }  
  20.   
  21.   
  22. voidvoid *fun2(voidvoid *arg)  
  23. {  
  24.     int i=5;  
  25.     while(i--)  
  26.     {     
  27.   
  28.     printf("pthread2 is  running \n");  
  29.     sleep(1);  
  30.   
  31.     }     
  32.   
  33.     pthread_exit((voidvoid *)2);  
  34.   
  35. }  
  36.   
  37.   
  38.   
  39. int main()  
  40. {  
  41.   
  42.     voidvoid *tmp;  
  43.   
  44.     if(pthread_create(&pth1_id,NULL,fun1,NULL)!=0)  
  45.     {     
  46.         printf("Create thread1 error ! \n");  
  47.     }     
  48.       
  49.     if(pthread_create(&pth2_id,NULL,fun2,NULL)!=0)  
  50.     {     
  51.         printf("Create thread2 error ! \n");  
  52.     }     
  53.   
  54.     printf("waitting pthread1 end....\n");  
  55.     if(pthread_join(pth1_id,&tmp)!=0)  
  56.     {     
  57.         printf("joining1 error! \n");  
  58.     }     
  59.     printf("pthread1 exit ret is %d\n",(intint *)tmp);  
  60.   
  61.     printf("waitting pthread2 end....\n");  
  62.      
  63.     if(pthread_join(pth2_id,&tmp)!=0)  
  64.     {  
  65.   
  66.         printf("joining2 error! \n");  
  67.     }  
  68.   
  69.     printf("pthread2 exit ret is %d\n",(intint *)tmp);  
  70.   
  71.     sleep(1);  
  72.   
  73.     return 0;  
  74. }  
  75.                
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>

pthread_t pth1_id,pth2_id;


void *fun1(void *arg)
{
    int i=3;
    while(i--)
    {   
    printf("pthread1 is  running \n");
    sleep(1);
    }   
    pthread_exit((void *)1);
    //return 0;
}


void *fun2(void *arg)
{
    int i=5;
    while(i--)
    {   

    printf("pthread2 is  running \n");
    sleep(1);

    }   

    pthread_exit((void *)2);

}



int main()
{

    void *tmp;

    if(pthread_create(&pth1_id,NULL,fun1,NULL)!=0)
    {   
        printf("Create thread1 error ! \n");
    }   
    
    if(pthread_create(&pth2_id,NULL,fun2,NULL)!=0)
    {   
        printf("Create thread2 error ! \n");
    }   

    printf("waitting pthread1 end....\n");
    if(pthread_join(pth1_id,&tmp)!=0)
    {   
        printf("joining1 error! \n");
    }   
    printf("pthread1 exit ret is %d\n",(int *)tmp);

    printf("waitting pthread2 end....\n");
   
    if(pthread_join(pth2_id,&tmp)!=0)
    {

        printf("joining2 error! \n");
    }

    printf("pthread2 exit ret is %d\n",(int *)tmp);

    sleep(1);

    return 0;
}
             



从运行结果可以看出pthread_join 是一个阻塞函数。


转自:http://blog.csdn.net/qq_17308321/article/details/49642183

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值