优先级翻转
使用信号量会导致的另一个潜在问题是线程优先级翻转问题。
所谓线程优先级翻转, 即当一个高优先级线程试图通过某种互斥IPC对象机制访问共享资源时,
如果该IPC对象已被一低优先级的线程所持有, 而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞的情况。
优先级翻转会造成高优先级线程的实时性得不到保证。

- 第①段:线程A和线程B处于挂起状态,线程C正在运行,运行的过程中访问共享资源M
- 第②段:线程A达到就绪条件,想要运行
- 第③段:线程A也需要访问共享资源M才可以运行,但是因为线程C占用了共享资源M,所以线程A无法运行
- 第④段:线程B也达到就绪条件,想要运行,而线程B在运行的过程中,不需要访问共享资源M,并且线程B的优先级高于线程C,所以线程B开始运行
- 第⑤段:线程B运行结束,线程C重新开始运行,运行完之后,释放共享资源M
- 第⑥段:线程A获取到了共享资源M,线程A开始运行
- 我们可以看到,虽然线程B的优先级比线程A低,但是线程B比线程A早运行,这种情况我们就将其称之为,线程的优先级翻转,会造成高优先级线程的实时性得不到保证。
- 在使用信号量来进行共享资源的互斥访问的时候,在信号量的value为0的时候,就会存在线程的优先级翻转的潜在问题,这一点是需要注意的。
优先级继承
在使用互斥量来进行共享资源的互斥访问的时候,不会存在线程的优先级翻转的潜在问题。
在 RT-Thread 中, 通过互斥量的优先级继承算法,可以有效的解决优先级翻转问题。
优先级继承
是指提高某个占有某种共享资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,