作者:张裕鹏 日期:2021-4-2

首先,线程是轻量级的进程,同一个进程下的所有线程共享几乎进程中的所有数据。所以进程间通信的方式也适合线程,比如常见的进程间通信有

  • 管道(命名管道、匿名管道)
  • 共享内存
  • 消息队列
  • 信号
  • socket
  • 信号量

而对于线程来说,更重要的是线程的安全,也就是当多个线程在访问同意共享数据时,如何保证其安全性?常见的方式有锁:

    • 二元信号量
    • 多元信号量(简称:信号量)
    • 互斥量
    • 临界区
    • 读写锁(3 种转态:读模式下加锁、写模式下加锁、不加锁)
    • 条件变量(条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。

条件本身是由互斥量保护的。线程在改变条件状态之前必须首先锁住互斥量)

区别和联系:
二元信号量 VS 互斥量:二元信号量可以由一个线程获取,之后由另一个线程释放;但是互斥量要求哪个线程获取,就要由哪个线程负责释放。

信号量、互斥量 VS 临界区:互斥量和信号量在任何进程中都是可见的,也就是说,一个进程创建一个互斥量或信号量,另一个进程试图去获取是合法的。而临界区只局限于本进程,其他进程无法获取。

读写锁:

读写锁状态 以共享方式获取 以独占方式获取
自由 成功 成功
共享 成功 等待
独占 等待 等待

线程常见的同步机制

常见的线程同步机制有以下 5 种

  • 互斥量
  • 读写锁
  • 条件变量(需要和互斥量一起使用)
  • 自旋锁(等待的时间短,而且不希望在重新调度上花太多成本)