思路:
實現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...