优先级翻转

因为各个技术博客、论坛,对于优先级翻转的说明十分混乱,所以在此记录一下正确的解释。

下图中,A、B、C为三条线程,优先级顺序为: C > B > A。其中,A和C对同一资源有竞争,B则无竞争。

下面是每个步骤的解释:

  • Step 1:线程A开始运行,并对竞争资源加锁
  • Step 2:线程C运行并请求竞争资源,但由于已经被线程A加锁持有,所以线程C只能停下等待锁被释放
  • Step 3:线程B开始运行,此时由于线程B的优先级,高于正在运行的线程A,低于已经停止运行的线程C,所以调度算法决定暂停线程A,让线程B得以继续运行
  • Step 4:线程B运行结束,调度算法让线程A恢复运行
  • Step 5:线程A运行结束,并释放对竞争资源的加锁,因此线程C得以持有竞争资源并继续运行

因此,线程B和线程C之间,就发生了优先级翻转的问题。同时对于这个问题的解决办法也有很多,诸如优先级继承、优先级天花板等。