0919线程

 

多线程
线程创建:生成线程需要激活进程
同比进程:多个线程使用相同的地址空间,共享大部分数据
    启动线程耗费的时间空间远小于进程间切换所需要的。
    通讯机制
    进程有独立的PCB和地址空间,线程有PCB但
    进程在调用线程函数ptherad_create()下,PCB裂变出两个线程(几个线程公用一个PCB)。
    线程为最小执行单位,进程为最小分配资源单位。
    ps -Lf 进程id    →LWP线程号

实现线程原理
1.轻量级进程拥有PCB,创建线程使用的底层函数和进程均为clone
2.进程内线程PCB指向内存资源的三级页表一致
3.进程可以蜕变为线程
4.每一个线程都有独立的寄存器和栈,故线程可看作寄存器和栈的集合

三级映射:进程PCB→页目录(可看成数组,首地址位于PCB中)→页表→物理页面→内存单元
多线程遵循POSIX线程接口,称为pthread。编写linux下的多线程程序,需要使用头文件pthread.h。
pthread在头文件pthreadtypes.h中定义:
typedef unsigned long int pthread_t:线程描述符

线程共享:
文件描述符表
每种信号的处理方式
当前工作目录
用户ID和组ID
内存地址空间()、共享全局变量

非共享:
线程ID 线程标识符
处理器现场和栈(用于标识核的运行状态)指针
核的栈空间
errno变量
信号屏蔽字
调度优先级

线程优缺点
程序并发性(切换线程依然需要时间)、开销小、数据通信共享数据方便
属于库函数,不稳定 调试编写困难、gdb不支持(相比于底层代码编写) 对信号支持不好(gdb开发时)。

pthread_self函数
获取当前程序的线程ID,对应进程的getpid()
pthread_t pthread_self(void);
成功返回线程id 失败返回"无!"

创建线程
pthread_create
int pthread_creatr(pthread_t *thread(传出参数,保存系统为我分配好的新线程ID),const pthread_attr_t *attr(传入*attr所指向的内容不能修改,或传入常量),void *(*start routine)(void*)(传入回调函数地址,函数名就是地址,所有传函数名),void *arg(传入回调函数需要的参数));
成功返回0,失败:错误码

arg传参注意事项:

pthread_exit函数
pthread_exit;
return NULL;返回至调用函数的位置
exit();所有线程都被结束

join函数
pthread_join(thread(线程id变量名),void **retval(指针));

分离状态detach
int pthread_detach(pthread_t thread(线程ID));
成功0 失败错误号
什么叫分离状态?
分离状态时干什么的?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值