C 實現mutex 互斥鎖

2021-10-09 13:11:11 字數 1002 閱讀 6417

思路:

實現mutex最重要的就是實現它的lock()方法和unlock()方法。

我們儲存乙個全域性變數flag,flag=1表明該鎖已經鎖住,flag=0表明鎖沒有鎖住。

實現lock()時,使用乙個while迴圈不斷檢測flag是否等於1,如果等於1就一直迴圈。然後將flag設定為1;unlock()方法就將flag置為0;

關鍵點:

假設thread a是第乙個執行到此的執行緒,那麼它得到的mutex->flag就肯定是0,於是它繼續跳出迴圈往下執行,希望通過下面的mutex->flag = 1來持有鎖,使得其它執行緒在檢測while迴圈時為真,進而進入迴圈的等待狀態。

可如果在a執行到這個賦值為1的語句之前,又有另外乙個thread b執行到了這個while迴圈部分,由於mutex->flag還未被賦值為1,b同樣可以跳出while,從而跟a一樣拿到這把鎖!這就出現了衝突。

那怎麼辦呢?仔細後可以發現,其實關鍵問題就在於:

對mutex->flag的檢測

對mutex->flag的賦值

這兩個操作必須是不被干擾的,也就是它必須是atomic的,要麼這兩段**不被執行,要麼這兩段**被不中斷地完整執行。

這就需要借助cpu指令集的幫助,來保證上述兩條語句的atomic操作,也即是著名的testandset()操作。

int

testandset

(int

*ptr,

intnew

)

完整**:

static

int flag=0;

//全域性標籤

inttestandset

(int

*ptr,

intnew

)void

lock()

void

unlock()

互斥鎖mutex的簡單實現

mutex一般用於為一段 加鎖,以保證這段 的原子性 atomic 操作,即 要麼不執行這段 要麼將這段 全部執行完畢。例如,最簡單的併發衝突問題就是乙個變數自增1 balance balance 1 表面看這是一條語句,可是在背後的彙編中我們可以看到,指令集操作過程中會引入中間變數來儲存右邊的值,...

互斥鎖mutex的簡單實現

mutex一般用於為一段 加鎖,以保證這段 的原子性 atomic 操作,即 要麼不執行這段 要麼將這段 全部執行完畢。例如,最簡單的併發衝突問題就是乙個變數自增1 balance balance 1 表面看這是一條語句,可是在背後的彙編中我們可以看到,指令集操作過程中會引入中間變數來儲存右邊的值,...

c 互斥鎖(Mutex)使用詳解

互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mutex 如果owned為true,互斥鎖的初始狀態就是被主線程所獲取,否則處於未獲取狀態 pu...