互斥量
- 两个线程的指令交叉执行
- 互斥量可以保证先后执行
- 称为原子性
- 原子性是指一系列操作不可被中断的特性
- 这一系列操作要么全部执行完成,要么全部没有执行
- 不存在部分执行部分未执行的情况
互斥锁
- 互斥量是最简单的线程同步的方法
- 互斥锁,处于两态之一的变量,解锁和加锁
- 两个状态可以保证资源访问的串行
- 操作系统直接提供了互斥量的API
- 开发者可以直接使用API完成资源的加锁,解锁操作
自旋锁
- 自旋锁也是一种多线程同步的变量
- 使用自旋锁的线程会反复检查锁变量是否可用
- 自旋锁不会让出CPU,是一种忙等待状态
- 死循环等待锁被释放
- 自旋锁避免了进程或线程上下文切换的开销
- 操作系统内部很多地方使用的是自旋锁
- 自旋锁不适合在单核CPU使用
读写锁
- 临界资源多读少写
- 读取的时候并不会改变临界资源的值
- 是否存在效率更高的同步方法
- 读写锁是一种特殊的自旋锁
- 允许多个读者同时访问资源以提高读性能
- 对于写操作则是互斥的
- pthread_rwlock_t
- pthread_rwlock_rdlock(读锁)
- pthread_rwlock_wrlock(写锁)
条件变量
- 条件变量是一种相对复杂的线程同步方法
- 条件变量允许线程睡眠,知道满足某种条件
- 当满足条件时,可以向该线程信号,通知唤醒
- 缓冲区小于等于0时,不允许消费者消费,消费者必须等待
- 缓冲区满时,不允许生产者往缓冲区生产,生产者必须等待
- 当生产者生产一个产品时,唤醒可能等待的消费者
- 当消费者消费一个产品时,唤醒可能等待的生产者
条件变量使用
- 需要配合互斥量使用
- pthread_cond_t
- pthread_cond_wait(等待条件满足)
- pthread_cond_notify(等待被唤醒)