#include <rtthread.h>
#define THREAD_PRIORITY 8
#define THREAD_TIMESLICE 5
/* 指向互斥量的指针 */
static rt_mutex_t dynamic_mutex = RT_NULL;
static rt_uint8_t number1,number2 = 0;
ALIGN(RT_ALIGN_SIZE)
// RT_ALIGN_SIZE此处为4,要求给下面的数组分配地址时满足4字节对齐
//作用:提高CPU访问效率。变量的内存地址正好位于它长度的整数倍(自然对齐,比如32位单片机是4字节)
//对齐跟数据在内存中的位置有关。一般设置的对齐方式为1,2,4字节对齐方式。
static char thread1_stack[1024];
static struct rt_thread thread1;
static void rt_thread_entry1(void *parameter)
{
while(1)
{
/* 线程 1 获取到互斥量后,先后对 number1、number2 进行加 1 操作,然后释放互斥量 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
number1++;
rt_kprintf("_1Entry1_1++!\n");
rt_thread_mdelay(10);
number2++;
rt_kprintf("_1Entry1 __2number2++\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("_1_____Release Entry1___!\n");
}
}
ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
static void rt_thread_entry2(void *parameter)
{
while(1)
{
/* 线程 2 获取到互斥量后,检查 number1、number2 的值是否相同,相同则表示 mutex 起到了锁的作用 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
if(number1 != number2)
{
rt_kprintf("not protect.number1 = %d, mumber2 = %d \n",number1 ,number2);
}
else
{
rt_kprintf("mutex protect ,number1 = mumber2 is %d\n",number1);
}
number1++;
number2++;
rt_kprintf("2entry2 ##!!\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("2Release Entry2!!%% \n");
if(number1>=50)
return;
}
}
/* 互斥量示例的初始化 */
int mutex_sample(void)
{
/* 创建一个动态互斥量 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_PRIO);
if (dynamic_mutex == RT_NULL)
{
rt_kprintf("create dynamic mutex failed.\n");
return -1;
}
rt_thread_init(&thread1,
"thread1",
rt_thread_entry1,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&thread1);
rt_kprintf("$$$$11111Startup thread 1 .!\n");
rt_thread_init(&thread2,
"thread2",
rt_thread_entry2,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY-1, THREAD_TIMESLICE);
rt_thread_startup(&thread2);
rt_kprintf("$$$$22222Startup thread 2 .!\n");
return 0;
}
/* 导出到 MSH 命令列表中 */
MSH_CMD_EXPORT(mutex_sample, mutex sample);
运算结果:
msh />mutex_sample
_1Entry1_1++!
$$$$11111Startup thread 1 .!
$$$$22222Startup thread 2 .!
msh />_1Entry1 __2number2++
mutex protect ,number1 = mumber2 is 1
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 2
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 3
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 4
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 5
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 6
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 7
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 8
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 9
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 10
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 11
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 12
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 13
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 14
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 15
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 16
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 17
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 18
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 19
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 20
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 21
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 22
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 23
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 24
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 25
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 26
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 27
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 28
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 29
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 30
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 31
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 32
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 33
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 34
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 35
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 36
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 37
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 38
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 39
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 40
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 41
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 42
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 43
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 44
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 45
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 46
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 47
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 48
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 49
2entry2 ##!!
2Release Entry2!!%
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
过程分析:
二、更改mdelay后:
static void rt_thread_entry1(void *parameter)
{
while(1)
{
/* 线程 1 获取到互斥量后,先后对 number1、number2 进行加 1 操作,然后释放互斥量 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
number1++;
rt_kprintf("_1Entry1_1++!\n");
// rt_thread_mdelay(10);
number2++;
rt_kprintf("_1Entry1 __2number2++\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("_1_____Release Entry1___!\n");
rt_thread_mdelay(10);
}
}
运行结果:
msh />mutex_sample
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
$$$$11111Startup thread 1 .!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
mutex protect ,number1 = mumber2 is 2
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 3
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 4
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 5
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 6
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 7
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 8
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 9
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 10
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 11
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 12
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 13
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 14
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 15
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 16
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 17
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 18
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 19
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 20
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 21
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 22
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 23
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 24
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 25
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 26
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 27
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 28
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 29
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 30
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 31
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 32
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 33
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 34
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 35
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 36
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 37
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 38
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 39
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 40
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 41
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 42
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 43
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 44
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 45
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 46
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 47
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 48
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 49
2entry2 ##!!
2Release Entry2!!%
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
$$$$22222Startup thread 2 .!
msh />_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
三、更改mutex初始化 线程2优先级
/* 互斥量示例的初始化 */
int mutex_sample(void)
{
/* 创建一个动态互斥量 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_PRIO);
if (dynamic_mutex == RT_NULL)
{
rt_kprintf("create dynamic mutex failed.\n");
return -1;
}
rt_thread_init(&thread1,
"thread1",
rt_thread_entry1,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&thread1);
rt_kprintf("$$$$11111Startup thread 1 .!\n");
rt_thread_init(&thread2,
"thread2",
rt_thread_entry2,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY+1, THREAD_TIMESLICE);
rt_thread_startup(&thread2);
rt_kprintf("$$$$22222Startup thread 2 .!\n");
return 0;
}
更改后所有代码:
#include <rtthread.h>
#define THREAD_PRIORITY 8
#define THREAD_TIMESLICE 5
/* 指向互斥量的指针 */
static rt_mutex_t dynamic_mutex = RT_NULL;
static rt_uint8_t number1,number2 = 0;
ALIGN(RT_ALIGN_SIZE)
static char thread1_stack[1024];
static struct rt_thread thread1;
static void rt_thread_entry1(void *parameter)
{
while(1)
{
/* 线程 1 获取到互斥量后,先后对 number1、number2 进行加 1 操作,然后释放互斥量 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
number1++;
rt_kprintf("_1Entry1_1++!\n");
// rt_thread_mdelay(10);
number2++;
rt_kprintf("_1Entry1 __2number2++\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("_1_____Release Entry1___!\n");
rt_thread_mdelay(10);
}
}
ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
static void rt_thread_entry2(void *parameter)
{
while(1)
{
/* 线程 2 获取到互斥量后,检查 number1、number2 的值是否相同,相同则表示 mutex 起到了锁的作用 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
if(number1 != number2)
{
rt_kprintf("not protect.number1 = %d, mumber2 = %d \n",number1 ,number2);
}
else
{
rt_kprintf("mutex protect ,number1 = mumber2 is %d\n",number1);
}
number1++;
number2++;
rt_kprintf("2entry2 ##!!\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("2Release Entry2!!%% \n");
if(number1>=50)
return;
}
}
/* 互斥量示例的初始化 */
int mutex_sample(void)
{
/* 创建一个动态互斥量 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_PRIO);
if (dynamic_mutex == RT_NULL)
{
rt_kprintf("create dynamic mutex failed.\n");
return -1;
}
rt_thread_init(&thread1,
"thread1",
rt_thread_entry1,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&thread1);
rt_kprintf("$$$$11111Startup thread 1 .!\n");
rt_thread_init(&thread2,
"thread2",
rt_thread_entry2,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY+1, THREAD_TIMESLICE);
rt_thread_startup(&thread2);
rt_kprintf("$$$$22222Startup thread 2 .!\n");
return 0;
}
/* 导出到 MSH 命令列表中 */
MSH_CMD_EXPORT(mutex_sample, mutex sample);
运行结果:
msh />mutex_sample
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
$$$$11111Startup thread 1 .!
mutex protect ,number1 = mumber2 is 1
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 3
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 4
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 5
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 6
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 7
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 8
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 9
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 10
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 12
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 13
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 14
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 15
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 17
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 18
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 19
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 20
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
21_____Release Entrymutex protect ,number1 = mumber2 is 22
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 23
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 24
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 26
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 27
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 28
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 29
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 30
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 32
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 33
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 34
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 35
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 36
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 38
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 39
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 40
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 41
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 42
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 43
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 45
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 46
2entry2 ##!!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 48
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 49
2entry2 ##!!
2Release Entry2!!%
$$$$22222Startup thread 2 .!
msh />_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
四、更改mutex初始化 线程2优先级
#include <rtthread.h>
#define THREAD_PRIORITY 8
#define THREAD_TIMESLICE 5
/* 指向互斥量的指针 */
static rt_mutex_t dynamic_mutex = RT_NULL;
static rt_uint8_t number1,number2 = 0;
ALIGN(RT_ALIGN_SIZE)
static char thread1_stack[1024];
static struct rt_thread thread1;
static void rt_thread_entry1(void *parameter)
{
while(1)
{
/* 线程 1 获取到互斥量后,先后对 number1、number2 进行加 1 操作,然后释放互斥量 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
number1++;
rt_kprintf("_1Entry1_1++!\n");
// rt_thread_mdelay(10);
number2++;
rt_kprintf("_1Entry1 __2number2++\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("_1_____Release Entry1___!\n");
rt_thread_mdelay(10);
}
}
ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
static void rt_thread_entry2(void *parameter)
{
while(1)
{
/* 线程 2 获取到互斥量后,检查 number1、number2 的值是否相同,相同则表示 mutex 起到了锁的作用 */
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
if(number1 != number2)
{
rt_kprintf("not protect.number1 = %d, mumber2 = %d \n",number1 ,number2);
}
else
{
rt_kprintf("mutex protect ,number1 = mumber2 is %d\n",number1);
}
number1++;
number2++;
rt_kprintf("2entry2 ##!!\n");
rt_mutex_release(dynamic_mutex);
rt_kprintf("2Release Entry2!!%% \n");
if(number1>=50)
return;
}
}
/* 互斥量示例的初始化 */
int mutex_sample(void)
{
/* 创建一个动态互斥量 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_PRIO);
if (dynamic_mutex == RT_NULL)
{
rt_kprintf("create dynamic mutex failed.\n");
return -1;
}
rt_thread_init(&thread1,
"thread1",
rt_thread_entry1,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&thread1);
rt_kprintf("$$$$11111Startup thread 1 .!\n");
rt_thread_init(&thread2,
"thread2",
rt_thread_entry2,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY-1, THREAD_TIMESLICE);
rt_thread_startup(&thread2);
rt_kprintf("$$$$22222Startup thread 2 .!\n");
return 0;
}
/* 导出到 MSH 命令列表中 */
MSH_CMD_EXPORT(mutex_sample, mutex sample);
运行结果:
msh />mutex_sample
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
$$$$11111Startup thread 1 .!
mutex protect ,number1 = mumber2 is 1
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 2
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 3
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 4
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 5
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 6
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 7
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 8
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 9
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 10
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 11
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 12
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 13
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 14
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 15
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 16
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 17
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 18
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 19
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 20
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 21
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 22
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 23
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 24
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 25
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 26
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 27
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 28
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 29
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 30
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 31
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 32
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 33
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 34
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 35
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 36
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 37
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 38
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 39
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 40
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 41
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 42
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 43
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 44
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 45
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 46
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 47
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 48
2entry2 ##!!
2Release Entry2!!%
mutex protect ,number1 = mumber2 is 49
2entry2 ##!!
2Release Entry2!!%
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
$$$$22222Startup th_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
y1___!
!
msh />_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!
_1Entry1_1++!
_1Entry1 __2number2++
_1_____Release Entry1___!