我们在处理 多进程/线程 数据的同步互斥时就会用到 “锁”,不同的操作系统和不同的语言提供了丰富的锁类型,但大体而言,可以用如下四个类别进行描述:

  • 互斥锁 (这里指简单类型)
  • 自旋锁
  • 递归锁
  • 读写锁

  首先,讨论锁是以线程为基本调度单位。

互斥锁

  这里的互斥锁指的是普通锁,即只有一个状态:加锁/未加锁。任何时刻同一个锁只能被一个线程所持有。若该线程重复对一个互斥锁加锁则会产生死锁。

自旋锁

  自旋锁和上面谈到的互斥锁基本一致,区别在于阻塞的方式。线程获取互斥锁时,若资源已被占用,那么线程会休眠并被调出就绪队列。而若是获取自旋锁时资源被占用,线程会轮询锁状态直到获得锁,这个过程中一直占用 CPU 。因此自旋锁一般用于等待获取锁时间比较短的情况。

递归锁

  上面讨论的两种锁,都是同一线程在一次执行中只能对同一个锁加锁一次,否则会发生死锁。而递归锁则是同一线程能多次加锁,多次解锁,其中有一个计数器用作管理加解锁状态。

  这样的设计使得很多死锁可以被避免,比如:函数中有加解锁操作,同时函数被递归调用 :)

读写锁

  读写锁很有特点,当 读锁 被获取后,其他尝试获取读锁的操作不会被阻塞,获取写锁 的操作会被阻塞。当 写锁 被获取后,其他 获取读锁、写锁 的操作都会被阻塞。这样设计能在读操作频繁的场景中提高执行效率。

  先就这样简单写一写吧 :)

标签: 并发

添加新评论