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總線上。