官网链接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_25
需要切记的是互斥量不能在中断服务例程中使用。
MDK配置
代码:
#define THREAD_PRIORITY 6 //优先级
#define THREAD_STACK_SIZE 512 //栈大小
#define THREAD_TIMESLICE 5 //线程时间片
static rt_mutex_t dynamic_mutex = RT_NULL; //定义互斥量指针
static rt_uint8_t number1 =0, number2 =0; //两个线程实现修改全局变量
//互斥量应用示例,两个线程对同一个变量加加
/******************************************************************************************
*** 函数名称: rt_thread_mutex1
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程1,等待互斥信号量释放后加加
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_25
*** 编者 时间 版本
*** wagnlu 2020/11/7 V0.1
******************************************************************************************/
static void rt_thread_mutex1(void* parameter)
{
while(1)
{
//线程1 获取到互斥信号量后,对number1\number2加加,然后释放互斥信号量
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
rt_kprintf(" rt_thread_mutex1 number1=%d,number2=%d\n",number1,number2);
number1 ++;
rt_thread_mdelay(1000); //等待2秒
number2 ++;
rt_mutex_release(dynamic_mutex); //释放互斥信号量
}
}
/******************************************************************************************
*** 函数名称: rt_thread_mutex2
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程2,等待互斥信号量释放后加加,并判断是否两个变量是否一致
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_25
*** 编者 时间 版本
*** wagnlu 2020/11/7 V0.1
******************************************************************************************/
static void rt_thread_mutex2(void* parameter)
{
while(1)
{
//线程 2 获取到互斥量后,检查 number1、number2 的值是否相同,相同则表示 mutex 起到了锁的作用
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
if(number1 == number2)
{
rt_kprintf("rt_thread_mutex2 mutex protect , number1 = number2 is %d\n", number1); //两个变量相等
}
else
{
rt_kprintf("rt_thread_mutex2 mutex NO protect , number1=%d, number2=%d\n", number1, number2); //两个变量不相等
}
if(number1 < 10) //查看效果
{
number1 ++;
rt_thread_mdelay(1000); //等待2秒
number2 ++;
rt_mutex_release(dynamic_mutex); //释放互斥信号量
}
else
{
rt_kprintf(" rt_thread_mutex2 exit\n");
return; //退出线程
}
}
}
/******************************************************************************************
*** 函数名称: mutex_sample
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:互斥量示例初始化
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_25
*** 编者 时间 版本
*** wagnlu 2020/11/7 V0.1
******************************************************************************************/
int mutex_sample(void)
{
//创建一个动态互斥量
dynamic_mutex = rt_mutex_create( "dmutex",RT_IPC_FLAG_FIFO); //互斥量的名称, 互斥量标志
if(dynamic_mutex == RT_NULL) //判断创建信号是否成功
{
rt_kprintf("create dynmaic mutex failed.\n"); //创建互斥信号量失败
return -1;
}
rt_thread_t tid = RT_NULL; //创建一个线程句柄
tid = rt_thread_create( "thread1", //线程名称
rt_thread_mutex1, //线程入口函数
RT_NULL, //线程入口函数传递参数
THREAD_STACK_SIZE, //线程栈大小
THREAD_PRIORITY, //线程优先级
THREAD_TIMESLICE); //线程时间片
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
tid = rt_thread_create( "thread2", //线程名称
rt_thread_mutex2, //线程入口函数
RT_NULL, //线程入口函数传递参数
THREAD_STACK_SIZE, //线程栈大小
THREAD_PRIORITY, //线程优先级
THREAD_TIMESLICE ); //线程时间片
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
return 0;
}
MSH_CMD_EXPORT(mutex_sample,mutex sample); //导出msh命令
展示效果: