互斥量作用:保護資源的互鎖
過程:用於互鎖的互斥量可以充當保護資源的令牌。當乙個執行緒希望訪問某個資源時,它必須先獲取令牌。當執行緒使用完資源後,必須還回令牌,以便其它執行緒可以訪問該資源。
在之前的訊號量提到關於執行緒優先順序翻轉的問題,互斥量可以通過優先順序繼承演算法,降低優先順序翻轉問題產生的影響
用於臨界資源的保護一般使用互斥量
目的?:為了降低優先順序翻轉問題
含義:暫時提高某個占有某種資源的低優先順序執行緒的優先順序,使之與在所有等待該資源的執行緒中優先順序最高那個執行緒的優先順序相等,而當這個低優先順序執行緒執行完畢釋放該資源時,優先順序重新回到初始設定值
翻轉危害::導致系統的高優先順序執行緒阻塞時間過長
例子:
————————————優先順序翻轉——————————
假設 3 個執行緒分別為 h 執行緒(high)、m 執行緒(middle)、l 執行緒
(low),3 個執行緒的優先順序順序為 h 執行緒》m 執行緒》l 執行緒。
正常執行的時候 h 執行緒可以打斷 m 執行緒與 l 執行緒,m 執行緒可以打斷 l 執行緒,假設系統中有乙個資源被保護了,此時該資源被 l 執行緒正在使用中,
(1):l 執行緒正在使用某臨界資源, h 執行緒被喚醒,執行 h 執行緒。但 l 執行緒並未執行完畢,此時臨界資源還未釋放。
(2):這個時刻 h 執行緒也要對該臨界資源進行訪問,但 l 執行緒還未釋放資源,由於保護機制,h 執行緒進入阻塞態,l 執行緒得以繼續執行,此時已經發生了優先順序翻轉現象。
(3):某個時刻 m 執行緒被喚醒,由於 m 執行緒的優先順序高於 l 執行緒, m 執行緒搶占了 cpu 的使用權,m 執行緒開始執行,此時 l 執行緒尚未執行完,臨界資源還沒被釋放。
(4):m 執行緒執行結束,歸還 cpu 使用權,l 執行緒繼續執行。
(5):l 執行緒執行結束,釋放臨界資源,h 執行緒得以對資源進行訪問,h 執行緒開始執行。
假設::有2個執行緒需要使用串列埠傳送資料,硬體資源只有乙個,可以用互斥量對串列埠資源進行保護,當乙個執行緒正在使用串列埠的時候,另乙個執行緒則無法使用串列埠,等到執行緒使用串列埠完畢之後,另外乙個執行緒才能獲得串列埠的使用權。
需要注意的是互斥量不能在中斷服務函式中使用。
(1):互斥量具有優先順序繼承機制,一般選擇使用互斥量對資源進行保護,如果資源被占用的時候,無論是什麼優先順序的執行緒想要使用該資源都會被阻塞。
(2):假如正在使用該資源的執行緒 1 比阻塞中的執行緒 2 的優先順序還低,那麼執行緒1 將被系統臨時提公升到與高優先順序執行緒 2 相等的優先順序(執行緒 1 的優先順序從 l 變成 h)。
(3):當執行緒 1 使用完資源之後,釋放互斥量,此時執行緒 1 的優先順序會從 h 變回原來的 l。
(4)-(5):執行緒 2 此時可以獲得互斥量,然後進行資源的訪問,當執行緒 2 訪問了資源的時候,該互斥量的狀態又為閉鎖狀態,其他執行緒無法獲取互斥量。
RT thread 互斥量中優先順序繼承機制
三個執行緒分別是 h執行緒 m執行緒 l執行緒 1.三個執行緒的優先順序順序是 h執行緒 m執行緒 l執行緒 2.正常執行的時候h執行緒可以打斷m執行緒與l執行緒,m執行緒可以打斷l執行緒 3.假設系統有乙個資源被保護了,此時該資源被l執行緒在使用,某一時刻h執行緒需要使用該資源,但l執行緒還未使用...
RT Thread應用5 訊息佇列1
一 訊息佇列概念 用於執行緒間通訊的資料結構 當佇列中的訊息是空時,掛起讀取執行緒,使用者還可以指定掛起的執行緒時間 timeout 當佇列中有新訊息時,掛起的讀取執行緒被喚醒並處理新訊息,訊息佇列是一種非同步的通訊方式。二 訊息佇列的運作機制 要點 三 訊息佇列的阻塞機制 阻塞機制 目的 為了保護...
Linux下執行緒同步物件 1 互斥量
程序是linux資源分配的物件,linux會為程序分配虛擬記憶體 4g 和檔案控制代碼等資源,是乙個靜態的概念。執行緒是cpu排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪...