Linux中的同步互斥

2021-10-05 13:16:17 字數 2149 閱讀 6165

生活中的例子:

洗菜必須在買菜之後, 做菜必須在洗菜之後, 吃飯必須在做菜之後.

軟體上的概念:

指的是散落在不同執行緒/程序中的**片段, 他們的執行順序必須是有序, 因為b**片段的執行依賴著a**片段的結果, 同理c**片段的執行依賴著b**片段的結果.

那麼, 怎麼實現abc的有序執行呢? 這就是同步的任務. 同步用於保證這幾個**片段的執行是有序的.

生活中的例子:

同一時間, 茅坑(馬桶)只能有乙個人蹲著, 人在進入廁所時會把門鎖上, 在上乙個人沒有出來前, 其他人沒辦法進去. 這就是互斥.如果你一定要用這個廁所, 但是發現廁所已經被其他人使用著, 根據你的反應, 存在兩種情況:

在門口等, 等上乙個人使用完立刻進去; 這個叫阻塞, 期間你沒辦法做任何事;

過一會再回來看看是否可以上廁所, 這個叫非阻塞, 期間你可以做其他事情, 例如給阿姨倒一杯卡布奇洛.

軟體上的概念:

針對系統的某些資源, 同一時間內只允許乙個程序/執行緒進行訪問, 當資源被占用時, 其它程序/執行緒不得占用, 這就是互斥. 當有乙個程序/執行緒, 需要訪問該資源, 而該資源被其它程序/執行緒占用時, 有存在兩種情況:

程序/執行緒原地等待(自旋等待/睡眠等待), 期間不會做其它事情, 直到獲取到該資源. 這個就是阻塞;

程序/執行緒先去做其他事情, 等會再次查詢該資源是否可用, 這個就是非阻塞.

個人觀點: 同步互斥更像一種兄弟關係, 沒必要分誰是誰的什麼, 但是兩者通常一起出現.

買菜->洗菜->做菜->吃飯, 這個流程中必須保持同步(有序進行), 但是過程中並不互斥, 哪乙個地方, 都可以插入多個人, 但是菜同一時間可能只有乙個人碰. 同步中存在著互斥.

上廁所為例子, 你必須先鎖上門, 然後才開始上廁所. 互斥中存在著同步.

**也源於生活, 不是嗎?

4.1 應用層

int fd =

open

("/dev/yangbkdevice"

, o_rdwr | o_nonblock)

;// 非阻塞方式開啟檔案, 預設是阻塞

int ret =

read

(fd,

&value,4)

;

4.2 驅動層

使用原子變數: (同一時間內只有乙個程序/執行緒可以修改它的值, 通過這個變數的數值改變來進行判斷, 在原子變數改變的前後只有乙個程序/執行緒訪問這段**/資源)

//定義原子變數並初始化為1

static atomic_t canopen =

atomic_init(1

);// 在驅動的open()函式中, 當需要執行臨界區的**/訪問敏感資源時, 試圖修改原子變數以試圖得到許可權.

/** * atomic_dec_and_test - decrement and test

* @v: pointer of type atomic_t

* * atomically decrements @v by 1 and

* returns true if the result is 0, or false for all other

* cases.

*/if(!

atomic_dec_and_test

(&canopen)

)// 操作/資源訪問完成時, 釋放許可權.

atomic_inc

(&canopen)

;

使用互斥鎖:

//定義互斥鎖

static

declare_mutex

(button_lock)

;// 在驅動的open()函式中

static

intbtn_open

(struct inode *inode,

struct file *file)

else

}tips: 在驅動的read

()函式中, 也需要判斷fd是否以非阻塞方式開啟, 也需要遵循o_nonblock

// 釋放互斥鎖up(

&button_lock)

;

同步與互斥只是乙個概念, 需要程式設計師去遵循的規則, 以防止程式跑飛.

linux 同步 互斥 概念

相交程序之間的關係主要有兩種,同步與互斥。所謂互斥,是指散步在不同程序之間的若干程式片斷,當某個程序執行其中乙個程式片段時,其它程序就不能執行它 們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。所謂同步,是指散步在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後...

Linux 互斥與同步

使用互斥鎖之前必須要建立乙個鎖的物件。互斥鎖的型別為pthread mutex t,建立乙個變數就是建立了乙個互斥鎖,我們通過這個變數建立開鎖和解鎖的聯絡。但這個鎖還不能夠直接使用,需要對其進行初始化。我們對建立好的鎖進行初始化的方法有兩種 第二個引數attr 如果傳入null,互斥鎖的屬性設定為預...

Linux中的同步技術之互斥量

互斥量從本質上說就像是一把鎖,提供資源的保護訪問,互斥量有兩種狀態,鎖住 lock 與解鎖狀態 unlock 用來保證一段時間內只有乙個執行緒使用該共享資源。互斥量的資料型別為pthread mutex t,如果互斥鎖變數是靜態分配的,那麼一般將其初始化為常值pthread mutex initia...