RT-Thread学习记录9 互斥量的使用

以下为看视频笔记..........

1. 例子说明互斥量

我们来看一个生活中的例子:现在大多银行ATM机都有一个特制的铁门。需要使用ATM的用户都需要在门前排队,进入铁门]使用ATM机的用户进入后会在里面将铁门锁住,以保障自身安全,这个时候,在门外排队的用户无法使用.ATM机;

当之前锁住ATM铁门的用户办理完业务,打开门以后,其他在外排队的用户才可以进入铁门使用ATM,这位进入铁门的用户也会和前一个用户一样,将门锁住,保障自身的安全。

例子中ATM机就相当于系统中的共享资源,需要使用ATM的用户相当于系统中的线程,而铁门,就起到了互斥量的作用。

2. 互斥量工作机制

互斥量 (互斥锁)是用于线程间互斥访问的IPC对象,它是一种特殊的 二值性信号量。当某个线程访问系统中的共享资源时,通过引入互斥量机制,可以保证其他线程无法取得对此共享资源的访问权。

互斥量只有两种状态: LOCKED和UNLOCKED, 分别代表加锁和开锁的两种情况。当有线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将对互斥量进行开锁,失去对它的所有权。当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它。持有该互斥量的线程也能够再次获得这个“锁”(递归持有)而不被挂起

3. 互斥量控制块

在RT—Thread中,互斥量控制块是操作系统用于管理互斥量的一个数据结构。

struct rt_mutex
{
    struct rt_ipc_object  parent;
    rt_uint16_t           value;    //只有两种状态,上锁和解锁
    rt_uint8_t            original_priority;  //保存上一次线程拥有互斥量的优先级
    rt_uint8_t            hold;   //保存某个线程拥有这个互斥量的次数
    struct rt_thread      *owner; //owner指向当前拥有这个互斥量的线程控制块
}

定义静态互斥量: struct  rt_mutex  static_mutex

定义动态互斥量:rt_mutex_t  dynamic_mutex    //rt_mutex_t 是struct  rt_mutex的指针。

4.互斥量的操作

初始化与脱离,这组API是针对静态互斥量的,
rt_err_t rt_mutex_init(rt_mutex_t,const char *name,rt_uint8_t flag) //对静态互斥量初始化,就是把互斥量加入到系统的对象管理器中,其中flag可为RT_IPC_FLAG_FIFO,RT_IPC_FLAG_PRIO,即决定线程获取互斥量的方式.
rt_err_t rt_mutex_detach(rt_mutex_t mutex) //从系统对象管理器中移除

创建与删除,这组API是针对动态互斥量的,
rt_mutex_t rt_mutex_create(const char *name,rt_uint8_t flag)
rt_err_t  rt_mutex_delete(rt_mutex_t  mutex)


获取互斥量,也称为互斥量的加锁操作;当线程申请互斥量时,互斥量已经被使用,则线程等待时间time,等待时间超过time返回-RT_TIMEOUT,可用 RT_WAITING_FOREVER永久等待,其值为=-1
rt_err_t rt_mutex_take(rt_mutex_t  rt_int32_t time)

释放互斥量
rt_err_t rt_mutex_release(rt_mutex_t mutex)//只有先获取互斥量后才能释放,
注意互斥量属于线程,rt_mutex_take()和rt_mutex_release()都只能在线程中使用,不能在中断中调用。
信号量可以在中断中释放信号量的

5. 实例

在mutex_sample.c中

6. 信号量VS互斥量

1、信号量可以由任何线程(以及中断)释放,它用于同步的时候就像交通灯,线程只有在获得许可的时候才可以运行,强调的是运行步骤;

斥量只能由持有它的线程释放,即只有“锁上”它的那个线程才有“钥匙”打开它。它用于互斥的时候就像--把钥匙,只有获得钥匙的线程才可以运行,强调的是许可和权限。

2、使用信号量可能导致线程优先级反转,而互斥量可通过优先级继承的方法解决优先级反转问题

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章