外观
互斥量示例
2026-05-15
概述
本文介绍如何在 睿擎工业开发平台 中创建并运行 互斥量(mutex) 示例工程,通过初始化一个互斥量和三个不同优先级的线程,演示多线程环境下对共享资源的访问控制。通过线程对互斥量的竞争与获取,帮助读者快速掌握互斥量在解决资源争用、防止多线程数据冲突方面的同步机制使用方法。
互斥量简介
互斥量(mutex)是一种用于实现多线程间互斥访问共享资源的同步机制。它确保同一时间只有一个线程能够获取并拥有该互斥量,从而防止多线程并发访问导致的资源竞争和数据不一致问题。当互斥量被某个线程占用时,其他试图获取该互斥量的线程将被阻塞,直到持有线程释放该互斥量。
构建与烧录
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化驱动

固化 APP

核心示例代码
互斥量示例相关 API
rt_mutex_init: 是RT-Thread内核用于静态初始化线程的核心函数(静态线程:栈空间与线程控制块由用户提前定义,编译时分配)rt_mutex_take:获取互斥量,RT_WAITING_FOREVER表示无限等待rt_mutex_release:释放互斥量
mutex_example.c
static void thread1_entry(void *param)
{
rt_err_t result;
rt_thread_mdelay(10);
rt_kprintf("thread1 try to get mutex\n");
result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);// 获取互斥量
if (result == RT_EOK)
{
rt_kprintf("thread1 got mutex\n");
rt_mutex_release(&static_mutex);// 释放互斥量
}
}
static void thread2_entry(void *param)
{
rt_err_t result;
rt_thread_mdelay(20);
rt_kprintf("thread2 try to get mutex\n");
result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);// 获取互斥量
if (result == RT_EOK)
{
rt_kprintf("thread2 got mutex\n");
rt_mutex_release(&static_mutex);// 释放互斥量
}
}
static void thread3_entry(void *param)
{
rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);// 获取互斥量
rt_kprintf("thread3 got mutex, and sleep 50ms\n");
rt_thread_mdelay(50);
rt_mutex_release(&static_mutex);// 释放互斥量
}
int mutex_example(void)
{
rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);// 初始化互斥量
rt_thread_init(&tid1, "thread1", thread1_entry, RT_NULL, tid1_stack, THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE);
rt_thread_startup(&tid1);
rt_thread_init(&tid2, "thread2", thread2_entry, RT_NULL, tid2_stack, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&tid2);
rt_thread_init(&tid3, "thread3", thread3_entry, RT_NULL, tid3_stack, THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
rt_thread_startup(&tid3);
return 0;
}运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
mutex_example命令
预期结果
- 线程 3 优先获取互斥量并持有 50 毫秒,期间线程 1 和 线程 2 依次尝试获取该互斥量
- 线程 1 和线程 2 因互斥量被占用而进入阻塞挂起状态,并触发优先级继承机制
- 线程 3 释放互斥量后,优先级最高的线程 1 优先获得互斥量,随后是线程 2
- 最终三个线程按照优先级顺序依次完成互斥量的获取与释放,程序正常运行完毕
RT-Thread 终端
msh />mutex_example
msh />thread3 got mutex, and sleep 50ms
thread1 try to get mutex
thread2 try to get mutex
thread1 got mutex
thread2 got mutex