RT_Thread学习笔记_3、IPC互斥量、解决优先级翻转

1、互斥量

  1. 特殊的二值性信号量
  2. 互斥量相较于信号量:
    1. 信号量像交通灯,强调运行步骤。互斥量像锁,强调许可和权限
    2. 使用信号量可能导致优先级翻转,互斥量通过优先级继承的方法解决翻转问题。
    3. rt_mutex_release(不可以在中断里调用)只有当take到才能用,跟信号量不同,可以take信号量A,一个release信号量B。
    4. 当take到互斥量后,再次take时,hold+1,但是线程不会挂起。
    5. value是二值的。
    6. 互斥量的结构体多了后面的三个成员:上次线程的优先级、曾经持有过互斥锁的线程数、当前的拥有者。
  3. 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 */
    };
    typedef struct rt_mutex *rt_mutex_t;
    
    //定义静态互斥量:struct rt_mutex static_mutex
    //定义动态互斥量:rt_mutex_t dynamic_mutex
    
  4. 互斥量的相关函数都在ipc.c里面自己查看就行
  5. 例如ATM机的铁门,每次只允许一个用户可以使用ATM机

二、优先级翻转

  1. 可以看到当线程A和C公用一块资源的时候,因为低优先级的C会拖累高优先级的A,而B从中得益。
  2. 利用优先级继承解决优先级翻转。将低优先级优先级暂时提升。
  3. 代码实现的关键在于实现优先级的变化,这些不用我们做了。RTT的内核已经写好了。
  4. 优先级翻转问题提醒我们对共享资源进行互斥访问代码应该尽可能的短

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值