作者:张裕鹏 日期:2021-4-2
首先,线程是轻量级的进程,同一个进程下的所有线程共享几乎进程中的所有数据。所以进程间通信的方式也适合线程,比如常见的进程间通信有
- 管道(命名管道、匿名管道)
- 共享内存
- 消息队列
- 信号
- socket
- 信号量
而对于线程来说,更重要的是线程的安全,也就是当多个线程在访问同意共享数据时,如何保证其安全性?常见的方式有锁:
- 锁
- 二元信号量
- 多元信号量(简称:信号量)
- 互斥量
- 临界区
- 读写锁(3 种转态:读模式下加锁、写模式下加锁、不加锁)
- 条件变量(条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
条件本身是由互斥量保护的。线程在改变条件状态之前必须首先锁住互斥量)
区别和联系:
二元信号量 VS 互斥量:二元信号量可以由一个线程获取,之后由另一个线程释放;但是互斥量要求哪个线程获取,就要由哪个线程负责释放。
信号量、互斥量 VS 临界区:互斥量和信号量在任何进程中都是可见的,也就是说,一个进程创建一个互斥量或信号量,另一个进程试图去获取是合法的。而临界区只局限于本进程,其他进程无法获取。
读写锁:
读写锁状态 | 以共享方式获取 | 以独占方式获取 |
---|---|---|
自由 | 成功 | 成功 |
共享 | 成功 | 等待 |
独占 | 等待 | 等待 |
线程常见的同步机制
常见的线程同步机制有以下 5 种
- 互斥量
- 读写锁
- 条件变量(需要和互斥量一起使用)
- 自旋锁(等待的时间短,而且不希望在重新调度上花太多成本)