1. 为什么要引入线程同步互斥机制
线程共享用户空间,当多个线程访问临界资源时会产生竟态,引入线程同步互斥机制是为了保护临界资源
2. 同步互斥的基本概念
- 临界资源:多线程任务执行时,能够同时访问的公共资源叫做临界资源
- 临界区:操作临界资源的代码段叫做临界区
- 竞态:多个线程公共强占临界资源的现象叫做竞态
- 互斥机制:多个线程同一时刻只能有一个线程访问临界资源,直到当前线程释放了临界资源的使用,其他线程才能继续抢占
- 同步机制:多个线程按顺序使用临界资源
- 解决同步互斥问题:
- 互斥锁
- 无名信号量
- 条件变量
3. 互斥锁
- 互斥锁本质上也是一个全局变量,是一个特殊的临界资源,当有一个线程获取到该互斥锁后,其余线程就不能再获取该锁资源,直到占有互斥锁资源的线程,将锁资源释放后,才能有机会抢到
- 关于互斥锁的操作:
- 定义互斥锁、
- 初始化互斥锁、
- 上锁(获取锁资源)、
- 解锁(释放锁资源)、
- 销毁锁
4. 无名信号量
- 同步:多个任务有顺序的执行,并且线程任务有执行先后顺序
- 最典型的例子是生产者消费者模型:生产者任务用于生产资源,而消费者任务用于消费资源,必须生产者先生产资源,消费者才能消费资源
- 无名信号量:本质上维护了一个value值,当生产者线程释放资源后,value值会增加,消费者申请value值后,该值会减少,当value值为0时,消费者线程任务申请资源处会阻塞
- 无名信号量也是一个临界资源,生产者或消费者一端改变该值,另一端也会进行修改
- 无名信号量适用一个生产者和一个消费者,当有多个消费者的时候,无法解决多个消费者之间的竟态
5. 条件变量
- 条件变量:条件变量维护了一个队列,当消费者线程需要申请资源时,先进入等待队列中,等待生产者线程的通知,生产者线程完成后,会优先通知等待队列中的第一个休眠线程进入唤醒状态。
- 条件变量机制完成的是一个生产者和多个消费者之间的同步关系,但是消费者线程和消费者线程在进入休眠等待队列的操作上是互斥的,所以要引入互斥锁
- 条件变量解决了一个生产者和多个消费者的同步问题