打印
[应用相关]

tm32 入门RT-Thread内核 线程间的通讯—互斥量

[复制链接]
490|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
互斥量用户线程间互斥访问的IPC对象,它是一种特殊的二值信号量。当某一个线程访问系统中的共享资源时,通过引入互斥量机制,可以保证其他线程无法取得对此共享资源的访问权。

使用特权

评论回复
沙发
一路向北lm|  楼主 | 2021-1-12 10:41 | 只看该作者
互斥量只有两种状态:LOCKED和UNLOCKED,分别代表加锁和开锁的两种情况。当线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将互斥量进行开锁操作,失去对它的所有权。当一个线程持有互斥量时,其它线程不能对它开锁或者持有它,只有这个持有互斥量的线程才能释放它进行开锁操作,其它线程才能被持有。

使用特权

评论回复
板凳
一路向北lm|  楼主 | 2021-1-12 10:41 | 只看该作者
在RT-Thread中,互斥量控制块是操作系统用于管理互斥量的一个数据结构。
struct rt_mutex
{
    struct rt_ipc_object parent;               /**< inherit from ipc_object */
    rt_uint16_t   value;                    /**< value of mutex */
    rt_uint8_t   original_priority;             /**< priority of last thread hold the mutex */
    rt_uint8_t   hold;                      /**< numbers of thread hold the mutex */
    struct rt_thread  *owner;                /**< current owner of mutex */
};
typedef struct rt_mutex *rt_mutex_t;


使用特权

评论回复
地板
一路向北lm|  楼主 | 2021-1-12 10:41 | 只看该作者
定义静态互斥量: rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag);
定义动态互斥量:rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);

使用特权

评论回复
5
一路向北lm|  楼主 | 2021-1-12 10:41 | 只看该作者
互斥量的操作函数:
创建静态互斥量
rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag);
rt_err_t rt_mutex_detach(rt_mutex_t mutex);
创建和删除动态互斥量
rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);
rt_err_t rt_mutex_delete(rt_mutex_t mutex);
获取互斥量
rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time);
释放互斥量
rt_err_t rt_mutex_release(rt_mutex_t mutex);

使用特权

评论回复
6
一路向北lm|  楼主 | 2021-1-12 10:42 | 只看该作者
基于STM32互斥量具体实例:
// 定义共享资源变量
rt_uint16_t  mutex_num1 = 0;
rt_uint16_t  mutex_num2 = 0;
// 定义互斥量控制块
static  rt_mutex_t  mutex_num = RT_NULL;
//创建互斥量
mutex_num = rt_mutex_create("mutex_test",RT_IPC_FLAG_FIFO);
if(mutex_num != RT_NULL)
{
        rt_kprintf("mutex create sucessful\n");
}
else
{
rt_kprintf("mutex create fial\n");
                 return -1;
}
//创建线程
  led1_thread = rt_thread_create("led1",task1,RT_NULL,1024,2,10);
        if(led1_thread != RT_NULL)
                  rt_thread_startup(led1_thread);
  else
                 return -1;
       
        led2_thread = rt_thread_create("led2",task2,RT_NULL,1024,3,5);
        if(led2_thread != RT_NULL)
                  rt_thread_startup(led2_thread);
  else       
           return -1;

// 入口函数
oid task1(void *parameter)
{
    while(1)
                {
     
                         rt_mutex_take(mutex_num,RT_WAITING_FOREVER);
                   mutex_num1 ++;
                         rt_thread_mdelay(100);       
                         mutex_num2 ++;
                         rt_mutex_release(mutex_num);
                }        
}


void task2(void *parameter)
{
    while(1)
                {
                       
                        rt_mutex_take(mutex_num,RT_WAITING_FOREVER);
                        if(mutex_num1 != mutex_num2)
                        {
                          rt_kprintf("mutex is Fial\n");
                        }
                        else
                        {
                           rt_kprintf("mutex is sucessful\n");
                        }
                        rt_mutex_release(mutex_num);
            rt_thread_mdelay(1000);       

                }       
}


使用特权

评论回复
7
一路向北lm|  楼主 | 2021-1-12 10:42 | 只看该作者
效果如下,task1使用互斥量对mutex_num1和 mutex_num2操作的过程中,task2是不能访问的。

使用特权

评论回复
8
磨砂| | 2021-2-3 23:43 | 只看该作者
会不会有竞争现象

使用特权

评论回复
9
晓伍| | 2021-2-3 23:46 | 只看该作者
互斥是必不可少的

使用特权

评论回复
10
八层楼| | 2021-2-3 23:49 | 只看该作者
呵呵呵  这个显示的界面很花心思啊

使用特权

评论回复
11
观海| | 2021-2-3 23:52 | 只看该作者
小北哥的介绍还是那么详细

使用特权

评论回复
12
guanjiaer| | 2021-2-3 23:54 | 只看该作者
互斥的话 需要有缓冲时间吗

使用特权

评论回复
13
一路向北lm|  楼主 | 2021-2-4 17:09 | 只看该作者
guanjiaer 发表于 2021-2-3 23:54
互斥的话 需要有缓冲时间吗

需要的

使用特权

评论回复
14
一路向北lm|  楼主 | 2021-2-4 17:09 | 只看该作者
晓伍 发表于 2021-2-3 23:46
互斥是必不可少的

是啊很重要的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3815

帖子

76

粉丝