[RTT例程练习] 1.6 线程优先级反转原理

线程优先级反转是一种可能导致高优先级线程等待低优先级线程释放资源的问题。在RTT系统中,线程A、B、C的优先级为A>B>C,A和C共享资源S。当C运行并持有S时,A和B挂起,导致A无法运行,即使A的优先级最高。这种情况下,A的实际运行顺序变为最后,从而产生优先级反转。官方示例通过线程交互演示了这一现象,最终高优先级线程thread2必须等待thread1释放信号量后才能继续执行。
摘要由CSDN通过智能技术生成

优先级反转是不希望出现的现象。

简单来说,有三个线程A, B, C, 优先级A>B>C,A和C有共享资源S。A.B挂起,C运行且有S,A没有S所以一直挂起,B进入调度,调度完之后C再运行直到释放S之后,A才能运行。

可以看出,A虽然优先级最高,但实际运行却是最后一个运行,其实际的优先级反转了。

下面这段来自官网:

三个线程的优先级顺序是 thread2 > worker > thread1,首先thread2得到执行,它得到信号量,并且释放,然后延时等待,然后worker线程得到处理器控制权开始运行,它也进行了延时操作,然后,thread1拿到了控制权,并且它申请得到了信号量,接着进行了打印操作,在它打印结束进行延时操作时,由于worker的优先级高于thread1,worker重新获得了控制,由于它并不需要信号量来完成下面的操作,于是很顺利的它把自己的一大串打印任务都执行完成了,纵然thread2的优先级要高于它,但是奈何获取不到信号量,什么也干不了,只能被阻塞而干等,于是实验原理中提到的那一幕便发生了。worker执行结束后,执行权回到了握有信号量的thread1手中,当它完成自己的操作,并且释放信号量后,优先级最高的thread2才能继续执行。

对应程序:

#include <rtthread.h>

static rt_sem_t sem;
static rt_uint8_t t1_count, t2_count
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值