Rtthread 互斥量

#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___!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值