Linu环境下线程可称为轻量级进程,但没有真正意义上的线程。
一、线程概念 (操作系统调度的基本单位)
- 基本定义:
线程是进程的分支执行流,在进程内部运行。 - 具体理解:
TCB 线程控制块,基本与进程相同;
多个线程共享虚拟地址空间、文件描述符、信号处理方式、当前工作目录以及用户ID和组ID;
线程独有栈、独立上下文、线程ID、一组寄存器、信号屏蔽器、调度优先级; - 线程优点:
创建新线程代价相对较低、线程间切换相对容易、占用资源较少;
能充分利用多处理器的可并行数量;
在等待慢速I/O操作结束的同时,程序可执行其他的计算任务;
计算密集型应用、I/O密集型应用,可提高性能; - 缺点:
性能损失:增加额外的同步和调度开销,二可用资源不变;
健壮性降低:某一线程异常会导致其他线程退出;
缺乏访问控制、编程难度提高;
二、线程控制
- 线程创建:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*star t_routine)(void*), void *arg);
参数 : thread:返回线程ID
attr:设置线程的属性,attr为NULL表⽰示使⽤用默认属性
start_routine:是个函数地址,线程启动后要执⾏行的函数
arg:传给线程启动函数的参数
返回值:成功返回0;失败返回错误码 - 线程退出:
1. 从线程函数return。这种⽅方法对主线程不适⽤用,从main函数return相当于调⽤用exit。
2. 线程可以调⽤用pthread_ exit终⽌止⾃自⼰己。
3. ⼀一个线程可以调⽤用pthread_ cancel终⽌止同⼀一进程中的另⼀一个线程。 - 线程等待(将PCB从R状态转换到非R状态)
int pthread_join(pthread_t thread, void **value_ptr);
参数 :
thread:线程ID
value_ptr:它指向⼀一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码 - 线程分离:(主线程不关注线程执行过程,只在意线程资源是否释放)
int pthread_detach(pthread_t thread);
分离时,禁止 join();
设置方式:
主线程->新线程;命令分离
新线程->主线程;要求分离
要求:主线程比新线程退出晚;
三、线程的同步与互斥
- 明确五大核心概念
临界资源:多个线程都能看到的公共资源;
临界区:多个线程中访问临界资源的代码;
互斥:独占性和排他性的访问临界资源;
同步:通常情况下,同步是要以互斥为前提,保证多个线程执行流顺序访问临界资源。(解决效率问题)
原子性:保证原子性,就能保证临界资源的安全性 - 互斥
保护临界资源,避免临界资源的二异性;
互斥锁:加锁过程中,将代码块转变成具有原子性的代码。
(保证临界资源的前提,本身具有原子性)
具体实现,之后更博。 - 同步(生产者与消费者模型)
环境变量:
允许在环境变量不满足的情况下等待;
在条件变量满足时,唤醒线程顺序访问临界资源; - 线程间的同步与互斥:可以实现无锁同步;