天天看點

BES 互斥鎖應用

一、同步與互斥的概念

  現代作業系統基本都是多任務作業系統,即同時有大量可排程實體在運作。在多任務作業系統中,同時運作的多個任務可能:

都需要通路/使用同一種資源;

多個任務之間有依賴關系,某個任務的運作依賴于另一個任務。

【同步】:

  是指散步在不同任務之間的若幹程式片斷,它們的運作必須嚴格按照規定的某種先後次序來運作,這種先後次序依賴于要完成的特定的任務。最基本的場景就是:兩個或兩個以上的程序或線程在運作過程中協同步調,按預定的先後次序運作。比如 A 任務的運作依賴于 B 任務産生的資料。

【互斥】:

  是指散步在不同任務之間的若幹程式片斷,當某個任務運作其中一個程式片段時,其它任務就不能運作它們之中的任一程式片段,隻能等到該任務運作完這個程式片段後才可以運作。最基本的場景就是:一個公共資源同一時刻隻能被一個程序或線程使用,多個程序或線程不能同時使用公共資源。

互斥鎖是什麼?

互斥鎖: 對共享資料進行鎖定,保證同一時刻隻能有一個線程去操作。

注意: 互斥鎖是多個線程一起去搶,搶到鎖的線程先執行,沒有搶到鎖的線程需要等待,等互斥鎖使用完釋放後,其它等待的線程再去搶這個鎖。互斥鎖隻有兩種狀态,即上鎖( lock )和解鎖( unlock )。

【互斥鎖的操作流程如下】:

1. 在通路共享資源後臨界區域前,對互斥鎖進行加鎖;

2. 在通路完成後釋放互斥鎖導上的鎖。

3. 對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的線程将會被阻塞,直到鎖被釋放。

#include "cmsis_os.h"

osMutexId vr_mutex_id = NULL;
osMutexDef(vr_mutex);

void fun_init()
{
  if(NULL == vr_mutex_id)
	   {
            vr_mutex_id = osMutexCreate((osMutex(vr_mutex)));//建立互斥鎖
	   	}
}
void fun_process()
{
	osMutexWait(vr_mutex_id, osWaitForever);//加鎖
    commands_flag=false;
	osMutexRelease(vr_mutex_id);//解鎖
}
           

繼續閱讀