你问的优先级继承是互斥锁特有的关键机制,目的是解决实时系统中常见的优先级反转问题—— 这也是为什么保护共享资源时互斥锁比二进制信号量更可靠的核心原因。

先搞懂:什么是 “优先级反转”?

优先级反转是指高优先级任务被低优先级任务阻塞,反而让中等优先级任务先执行的反常现象,会导致高优先级任务的响应延迟,违背实时性要求。
举个贴近你代码的例子(无优先级继承时):
任务 H(OrangeLedTask,高优先级):需要访问共享资源(比如你的AccessSharedData);
任务 L(GreenLedTask,低优先级):正在持有共享资源的互斥锁,执行临界区代码;
任务 M(RedLedTask,中等优先级):不需要共享资源,随时可运行。
此时的执行顺序会变成:

  1. 任务 L 持有锁,正在执行;
  2. 任务 H 就绪,想要获取锁,但因为任务 L 持有锁,任务 H 进入阻塞态;
  3. 任务 M 就绪(比如定时到),由于它优先级高于任务 L,抢占了 CPU 执行;
  4. 任务 L 被任务 M 阻塞,迟迟无法释放锁;
  5. 高优先级的任务 H 反而要等中等优先级的任务 M 执行完,才能等到任务 L 释放锁—— 这就是 “优先级反转”,高优先级任务被 “卡住” 了。

优先级继承:怎么解决这个问题?
优先级继承是互斥锁的机制:当高优先级任务因等待互斥锁被阻塞时,持有锁的低优先级任务会临时继承高优先级任务的优先级,直到它释放锁为止。
还是上面的例子(有优先级继承时):

  1. 任务 L 持有锁,正在执行;
  2. 任务 H 就绪,请求锁失败并阻塞;
  3. 互斥锁触发优先级继承:任务 L 的优先级被临时提升到任务 H 的优先级;
  4. 此时任务 M(中等优先级)无法抢占任务 L(现在是高优先级);
  5. 任务 L 可以顺利执行完临界区代码,释放锁;
  6. 任务 L 的优先级恢复为原来的低优先级,任务 H 获取锁并执行。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐