例说互斥量

我们来看一个生活中的例子:现在大多银行ATM机都有一个特制的铁门。

需要使用ATM机的用户都需要在铁门前排队,进入铁门使用ATM机的用户进入后会在里面将铁门锁住,以保障自身安全,这个时候,在铁门外排队的用户无法使用ATM机。

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

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

互斥量工作机制

互斥量(又称:互斥锁)是用于线程互斥访问的**(进[线]程间通信)IPC 对象**,它是一种特殊二值性信号量

某个线程访问系统中共享资源时,通过引入互斥量机制,可以保证其他线程无法取得对此共享资源访问权

image.png

互斥量只有两种状态LOCKEDUNLOCKED,分别代表加锁开锁两种情况

当有线程持有互斥量时,互斥量处于闭锁状态,由这个线程获得它的所有权

当这个线程释放互斥量时,将对互斥量进行开锁这个线程失去对它的所有权

当一个线程持有互斥量时,其他线程不能对它进行开锁持有它

持有该互斥量线程能够再次获得这个““(递归持有)而不被挂起

互斥量控制块

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

struct rt_mutex
{
    struct rt_ipc_object parent;             // 继承自 ipc_object
    rt_uint16_t          value;              // 互斥量的值【只有**两种状态**:LOCKED 和 UNLOCKED,分别代表**加锁**和**开锁**的两种情况】
    rt_uint8_t           original_priority;  // **上一个**持有互斥量的线程的**优先级**
    rt_uint8_t           hold;               // 当前线程持有互斥量的**次数**
    struct rt_thread    *owner;              // 当前持有互斥量的线程的线程控制块的指针
};
typedef struct rt_mutex *rt_mutex_t;

**// 定义静态互斥量**
struct rt_mutex static_mutex;  // 结构体类型

**// 定义动态互斥量**
rt_mutex_t dynamic_mutex; // 指针类型

互斥量的操作