rt-thread学习笔记——9、创建互斥信号量

官网链接: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命令

 

展示效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值