rtthread学习-防止优先级翻转

学习视频网址:
RT-Thread内核入门指南-线程的优先级翻转问题

学习记录。

第一次学这门课的时候,是觉得有点迷糊
课上讲了ABC三个优先级的线程,A是需要使用C中的互斥量,而互斥量在C中锁住了,所以A被挂起了,只有C释放了mutex后A才能就绪,才能被任务调度器调度。在等待过程中,B线程就绪了,而B线程的优先级比C高,按道理,此时B应该需要先运行,运行完成之后才能运行C,C释放了mutex之后A才能运行,此时就出现了个问题,明明A的优先级比B高,却是B比A先运行。这就是优先级翻转。
【整理】什么是优先级反转+有何危害+如何避免和解决
这篇文章讲的很好,然后我就了解了什么是优先级翻转。

为了阻止这种事情的发生,互斥锁里面有一种机制,可以继承上一级的优先级,按照上述例子,即C可以继承A的优先级
下面是互斥锁的结构体定义,主要是通过指针owner和变量 original_priority实现的

/**
 * Mutual exclusion (mutex) structure
 */
struct rt_mutex
{
    struct rt_ipc_object parent;                        /**< inherit from ipc_object */
    rt_uint16_t          value;                         /**< value of mutex */
    rt_uint8_t           original_priority;             /**< priority of last thread hold the mutex */
    rt_uint8_t           hold;                          /**< numbers of thread hold the mutex */
    struct rt_thread    *owner;                         /**< current owner of mutex */
};

如何继承的呢? 在ipc.c中的731行开始

    /* change the owner thread priority of mutex */
     if (thread->current_priority < mutex->owner->current_priority)
     {
         /* change the owner thread priority */
         rt_thread_control(mutex->owner,
                           RT_THREAD_CTRL_CHANGE_PRIORITY,
                           &thread->current_priority);
     }

thread是当前的thread,即当线程A执行到这里的时候,这个thread->thread-A
mutex->owner 是thread-C,因为C还没处理完

通过rt_thread_control这个函数,实现了把A的优先级赋值给了C

所以当B就绪的时候,因为C的优先级提高了,所以任务调度器会先执行C,再执行A,最后再执行B,防止先B后A导致优先级翻转。

rt_thread_control这个函数也挺有意思,他会把旧的低优先级的C从任务队列里面丢掉,给C赋予新的优先级后再把它插入任务队列里面,具体可以进去看一看,原来RT-Thread里面是这样干的。
注意if (thread->current_priority < mutex->owner->current_priority)之所以成成立,是因为A的优先级比C高 ,值越小优先级越高,刚好反过来的。所以A优先级的值比C小,所以能成立。

讲完了这个视频课程里面的例子,知道了什么是优先级翻转之后,视频课程里面对应的代码如果是第一次看的话会让人感觉疑惑。
代码的设计是这样的 ,设计了也是ABC三个线程,A线程优先级最高,依次递减。
代码里面是想通过B-C直接的互动来演示防止出现优先级翻转的情况,而A只是作为一个监视者,因为A优先级最高可以一直打印他们的优先级。不用过于纠结A线程,重点是需要看BC之间的互动。

但是因为刚开始课件里面的例子也是ABC,所以很容易让人混淆。
其实最好应该是在BC之间再添加一个X线程,BXC线程对应课件例子的ABC线程,这样就不容易让初学者产生误解了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值