Linux核心同步方法 互斥鎖

2021-08-20 14:01:23 字數 1227 閱讀 4364

「互斥體(互斥)」指的是任何可以睡眠的強制互斥鎖,比如計數是1的訊號量。

也就是說,互斥體是一種互斥訊號。

互斥在核心中對應資料結構互斥,其行為和使用計數為1的訊號量類似,因為是直接呼叫的訊號量的操作介面,實現更高效,而且使用限制更強。也就是乙個簡化版的訊號量,因為不需要管理任何使用計數。

#define mutex_default		0x0

typedef struct semaphore mutex_t;

#define mutex_init(lock, type, name) sema_init(lock, 1)

#define mutex_destroy(lock) sema_init(lock, -99)

#define mutex_lock(lock, num) down(lock)

#define mutex_trylock(lock) (down_trylock(lock) ? 0 : 1)

#define mutex_unlock(lock) up(lock)

互斥的基本操作列表如下:

·任何時刻只有乙個任務可以持有互斥,也就是說互斥的使用計數永遠是1。

·在同一上下文中上鎖和解鎖。切記不能在乙個上下文中鎖定乙個互斥體,而在另乙個上下文中給它解鎖。這個限制使得互斥體不適合核心同使用者空間複雜的同步場景。

·不能遞遞地持有同乙個鎖。也就是不能遞上地上鎖和解鎖,同樣也不能去解鎖乙個已經被解開的互斥。

·當持有乙個互斥時,程序不可以退出。

·互斥不能在中斷或者下半部中使用,即使使用mutex_trylock()也不行。

·互斥不可被手動初始化,拷貝或者重複初始化。

相比訊號量,優先使用使用互斥。如果不能滿足其約束條件,且沒有其他別的選擇時,再考慮選擇訊號量。

程式設計中,了解何時使用自旋鎖,何時使用互斥鎖(或訊號量)是很重要的一般情況下,再中斷上下文中只能使用自旋鎖;而在任務睡眠時只能使用互斥鎖。

Linux 執行緒同步方法 互斥鎖

在單執行緒條件下,由於對資料操作,在同樣的時間下,只有乙個執行緒來操作。所以不用擔心資料的同步問題。現代的作業系統,大都提供併發機制,雖然有時候是表面的併發。在 linux 中,併發用的最多的是基於執行緒的併發,程序的代價太高了,這樣,乙個共享的資料,在同一時間內,可能有多個執行緒在操作。如果沒有同...

Linux 執行緒同步 互斥量(互斥鎖)

1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...

linux執行緒》同步互斥機制之 互斥鎖

本文基於訊號量 如果訊號量的值最多為1,那實際上相當於乙個共享資源在任意時刻最多只能有乙個執行緒在訪問,這樣的邏輯稱為 互斥 這時,有一種更加方便和語義更加準確的工具來滿足這種邏輯 互斥鎖。幾個執行緒同時去搶乙個鎖,誰搶到了鎖就進門把房間鎖上,訪問資料,出來後之前解鎖。照這樣的邏輯,互斥鎖的操作無非...