linux-线程

linux-线程

在这里插入图片描述

- 线程的概念

1>linux的线程与windos的线程区别很大(win的线程比较完善,进程不行,linux的进程发展的更早)

2>每一个进程都会分配0-4G的虚拟空间地址,而线程共享0-4G的虚拟地址空间,但每一个线程有自己不同的pcb.但pcb中指向内存资源的三级页表是相同的
在这里插入图片描述三级页表(mmu映射虚拟地址到物理内存的过程)
在这里插入图片描述

3>线程是最小的执行单位(抢占cpu的最小单位(根据线程的LWP号(使用ps -Lf pid//查看指定的线程LWP号))),进程是最小的资源分配单位(0-4G资源分配).
4>进程可以蜕变成线程
5>线程可看做是寄存器和栈的集合

- 线程之间共享的资源和非共享的资源

1>线程共享的资源
a:文件描述符表
b:每种信号的处理方式(所以线程不建议使用信号,共享处理,互相干扰)
c:当前工作目录(因为创建线程需要进程,进程不变,多个线程自然共享工作目录)
d:用户ID和用户组ID
e:内存地址空间(.text/.data/.bss/heap/共享库)(除开了栈空间:因为栈空间存储的每个线程的函数h和变量)
2>线程独享的资源
a:线程ID
b:处理器现场和栈指针(内核栈)
c:独立的栈空间(用户空间栈)
d:errno变量
e:信号屏蔽字(系统阻塞信号集)
f:调度优先级

- 线程与进程的对比

优点:1>程序的并发性更高(抢占cpu的执行时间更强);2>开销小(与进程相差不是特别大);3>数据通信,共享数据方便;(因为工共享用户区(出去栈空间))
缺点(都不是很突出的问题):1>线程多使用库函数,相比系统函数不稳定;2>不支持gdb调试;3>对信号支持不友好;

- 线程控制函数

1>pthread_self()函数:相当于getpid();获取当前线程的ID号(用于进程间识别不同的线程).(注意:不应使用pthread_create()函数的传出参数获取线程的ID号,而应使用该函数)
2>pthread_create()函数(相当于fork()函数)
注意:linux环境下,所有线程特点,失败若有返回值,直接返回的是编号;(区别进程)
3>pthread_exit()函数(注意:exit();pthread_exit();return ;三者在线程编程中的使用)
a:pthread_exit:结束调用该函数的线程;
b:return:返回到调用函数的地方(上一级)
c:exit:结束进程,所有的线程也会结束(线程编程慎重使用)
4>pthread_join()函数(相当于wait()函数(阻塞等待回收))
注意:进程是父进程给子进程回收,但是线程可以不,子线程也可以调用该函数进行回收指定的线程.
5>pthread_detach()函数(线程独有的)
将线程分离,分离后的线程结束后自动清理pcb控制部分的资源回收;常用于服务器里.分离后的线程就不需要pthread_join()函数回收(回收分离线程会报错);
6>pthread_cancel()函数
注意:杀死(取消)线程,相当于进程的kill()函数,但是pthread_cancel()函数不是实时的,必须到达取消点(比如系统调用:pause,wait,等函数,man 7 pthreads查看取消点)才会取消.

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

	/*******************************************************
	*函数:pthread_self() 
	*头文件: #include <pthread.h>
	*格式: pthread_t pthread_self(void); //pthread_t:typedef unsigned long 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值