1.线程概念
线程是什么:是进程内部的一条执行流,是CPU调度的基本单元。
本质:Linux下线程的本质就是task_struct
Linux下的这个调度单元就是pcb,而这个pcb相较于传统操作系统设计的pcb更加轻量,因此Linux下的线程也被称为轻量级进程
2.进程和线程区别:
从功能性质上的差别:
进程:是系统进行资源分配的基本单元;
线程:是系统中进行CPU调度的基本单元
使用上的差别:针对多任务的处理
多进程:资源消耗成本更高,稳定性更高
多线程:资源消耗的成本更低,调度切换成本更低,线程间通信更加方便,执行粒度更加细致
3.线程间的共享和独有:
共享:进程ID,虚拟地址空间+页表,打开的文件信息,信号信息,进程间通信描述信息....
独有:线程ID,调度上下文信息,线程栈空间.....
4.线程的控制:
Linux下的线程是大佬们封装的一套库函数实现的控制操作的一个函数库
pthread_create ->clone(pcb)
用户态线程:针对线程上层封装描述后的执行流+数据的整体
相对独有的数据:用户态线程ID 线程栈内部的局部数据 用户态控制的描述信息
内核态线程:就指的是pcb-task_struct
(1)线程创建
pthread_create(&tid,&attr,Func,arg)
LWP:轻量级进程ID
ps -L:进行查看轻量级进程信息
轻量级进程ID:就是task_struct里边的pid,每个轻量级进程唯一的
pthread_t线程ID:虚拟地址空间中线程独有线程描述空间的地址
(2)线程退出
- 线性入口函数中return(线程入口函数运行完毕,线程就会退出)
- void pthread_exit(void* retval); 在线程内部调用的任意函数中调用都可以退出线程
- void pthread_cancel(pthread_t tid);取消一个线程
- 被取消的线程,它的返回值没有参考意义的(是一个固定值:PTHREAD_CABCELED)
(3)线程等待
等待指定线程退出,获取返回值,释放它的所有资源
int pthread_join(pthread_t tid,void** retval);
(4)线程分离
设置线程的分离属性:从joinable设置为detach状态
线程一旦被分离,线程退出后,就会自动释放所有的资源,不需要被等待,也不能被等待
void pthread_detach(pthread_t tid);
应用场景:当我们不关系一个线程的返回值,而且也不希望阻塞在等待上,则使线程分离
5.线程安全
多个线程之间对同一份临界资源的访问安全性要求
如何实现:同步+互斥;
互斥的实现:互斥锁
同步的实现:条件变量,信号量
读写锁
自旋锁
锁的种类
死锁
生产者消费者模型
读者写者模型
1.什么是并发,什么是并行?