我们来看一个生活中的例子:现在大多银行ATM机都有一个特制的铁门。
需要使用ATM机的用户都需要在铁门前排队,进入铁门使用ATM机的用户进入后会在里面将铁门锁住,以保障自身安全,这个时候,在铁门外排队的用户无法使用ATM机。
当之前锁住铁门的用户办理完业务,打开铁门以后,其他在外排队的用户才可以进入铁门使用ATM机,这位进入铁门的用户也会和前一个用户一样,将铁门锁住,保障自身的安全。
例子中ATM机就相当于系统中的共享资源,需要使用ATM的用户相当于系统中的线程,而铁门,就起到了互斥量的作用。
互斥量(又称:互斥锁)是用于线程间互斥访问的**(进[线]程间通信)IPC 对象**,它是一种特殊的二值性信号量。
当某个线程访问系统中的共享资源时,通过引入互斥量机制,可以保证其他线程无法取得对此共享资源的访问权。

互斥量只有两种状态:LOCKED 和 UNLOCKED,分别代表加锁和开锁的两种情况。
当有线程持有互斥量时,互斥量处于闭锁状态,由这个线程获得它的所有权。
当这个线程释放互斥量时,将对互斥量进行开锁,这个线程失去对它的所有权。
当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它。
持有该互斥量的线程也能够再次获得这个“锁“(递归持有)而不被挂起。
rt_mutex_take 获取到这个互斥量的时候,它再次去调用 rt_mutex_take 获取互斥量的时候,这个线程不会被挂起,可以再次获取到。在 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; // 指针类型