天天看點

8.互斥量的使用--mutex

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

繼續閱讀