linux+分离线程+退出,linux下的线程的创建退出及回收

1.线程相关的概念:

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

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

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

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

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

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

2.线程编程:

线程标识

线程ID

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

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

函数: pthread_self()

0818b9ca8b590ca3270a3433284dd417.png

pthread_t 用于声明线程ID

无符号整数表示

创建线程:

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

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

0818b9ca8b590ca3270a3433284dd417.png

退出线程

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

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

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

执行结果:

0818b9ca8b590ca3270a3433284dd417.png

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

等待线程

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

•pthread_join()函数

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

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

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

#include

#include

#include

#include

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;

}

0818b9ca8b590ca3270a3433284dd417.png

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值