概述
1.举例理解互斥量
停车场(只有一个停车位)
----------------
car1
----------------
car1进去后给停车场上锁,其他车就进不去了。
car2 car3 car4
同时只能有一个线程占有公共资源。
互斥量是一种保护共享资源的方法。当一个线程拥有互斥量的时候,另一个线程若是等待锁, 则其就会被挂起,从而保证只有一个线程会操作共享数据。
2.例程源码解析及互斥量的相关操作
初始化(静态)/创建(动态)、 获取 、 释放 、 detach脱离(静态)/删除(动态)
互斥量的定义:
/* 互斥量控制块 */
static struct rt_mutex static_mutex;
/* 指向互斥量的指针 */
static rt_mutex_t dynamic_mutex = RT_NULL;
动态静态互斥量创建:
/* 初始化静态互斥量 */
result = rt_mutex_init(&static_mutex, "smutex", RT_IPC_FLAG_FIFO);
if (result != RT_EOK)
{
rt_kprintf("init static mutex failed.n");
return -1;
}
/* 创建一个动态互斥量 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_FIFO);
if (dynamic_mutex == RT_NULL)
{
rt_kprintf("create dynamic mutex failed.n");
return -1;
}
获取互斥量:
result = rt_mutex_take(&static_mutex, 10);
释放互斥量:
rt_mutex_release(&static_mutex);
静态互斥量脱离:
rt_mutex_detach(&static_mutex);
动态互斥量删除:
rt_mutex_delete(dynamic_mutex);
3.互斥量的本质--二值信号量
互斥量初始化完成后是打开的,任意一个线程都能获取
4.互斥量的使用注意事项
互斥量不能在中断中获取、释放、互斥量不能出现在中断中!!!!
5.信号量和互斥量的比较
互斥量只能由获取互斥量的任务释放---解铃还需系铃人
互斥量相当于一把钥匙,只有获取钥匙的线程才能获取公共资源。
信号量可能导致优先级反转,互斥量不会。
举例:
信号量强调的是做事情的顺序:先做什么,后做什么
以电子触摸屏为例:
touch_panel;
pen_int()//触摸笔中断,触摸后发生
{
...
rt_sem_release(dynamic_sem);//释放信号量
...
}
while(1)
{
if(RT_EOK==rt_sem_take(dynamic_sem));//获取到信号量
{
x=...//计算触摸的X Y位置
y=...
}
else
{
.....
}
}
互斥量:
IIC总线上有A、B、C设备。
A B C
A在用IIC的时候把IIC资源锁上,B、C无法对IIC总线操作,同时只能有一个设备在IIC总线上。
最后
以上就是野性草丛为你收集整理的8.互斥量的使用--mutex的全部内容,希望文章能够帮你解决8.互斥量的使用--mutex所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复