互斥量概念,用法,死鎖演示及解決詳解

2021-09-01 19:56:36 字數 2262 閱讀 3610

保護共享資料,用**把共享資料鎖住,其他想操作共享資料的執行緒得等待解鎖。

互斥量的概念:

互斥量是個類物件。多個執行緒嘗試lock鎖上。結果:只有乙個執行緒能夠鎖定成功,成功的標誌是lock函式返回。如果沒鎖成功,那麼流程就會卡在lock這,不斷嘗試去鎖,一直到成功。

互斥量使用起來要小心,保護資料不要多也不要少,少了程式該崩潰還是崩潰,多了影響程式的執行效率。

互斥量的用法:

標頭檔案

#include//互斥量
步驟:先lock(),操作共享資料,unlock();

lock()和unlock()要成對使用。

static int num_push = 0;

static int num_pop = 0;

class a

} bool booloutmsg(int &commend)

cout << ++num_pop << endl;

my_mutex.unlock();

return false;

} void outmsgrecquene()

else

}}};

int main()

std::lock_guardtext建構函式裡執行了mutex的lock(),析構函式裡執行了mutex的unlock()。

但是不太靈活,必須要等析構函式執行才會解鎖。

lock_guard例項

static int num_push = 0;

static int num_pop = 0;

class a

} bool booloutmsg(int &commend)

cout << ++num_pop << endl;

return false;

} void outmsgrecquene()

else

}}};

int main()

死鎖產生的前提條件:是由至少兩個互斥量才會產生這個問題。

一般解決方案:只要順序不搞亂,就不會出現死鎖。

std::lock()函式模板:兩個互斥量的時候才使用

要麼兩個互斥量都鎖住,要麼兩個互斥量都沒鎖住。

static int num_push = 0;

static int num_pop = 0;

class a

} bool booloutmsg(int &commend)

my_mutex2.unlock();

my_mutex1.unlock();

cout << ++num_pop << endl;

return false;

} void outmsgrecquene()

else

}}};

int main()

std::lock_guard test(my_mutex1, std::adopt_lock);表示之前已經鎖過了。

static int num_push = 0;

static int num_pop = 0;

class a

} bool booloutmsg(int &commend)

cout << ++num_pop << endl;

return false;

} void outmsgrecquene()

else

}}};

int main()

C 多執行緒 互斥量 死鎖

在多執行緒的使用中,如果我們建立了多個執行緒,多個執行緒之間的執行順序是由cpu來完成排程的,因此我們如果需要在多執行緒中進行資料共享和通訊,就需要注意資料安全的問題,有可能我在乙個執行緒中正在執行對資料的操作,此時cpu通過上下文切換,把當前執行緒切換掉了,開始執行了別的執行緒,而別的執行緒本來希...

執行緒同步之互斥量加鎖解鎖 死鎖

與互斥鎖相關api 互斥量 mutex 從本質上來說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對互斥量進行加鎖後,任何其他試圖再次對互斥量加鎖的執行緒將會被阻塞直到當前執行緒釋放該互斥鎖。如果釋放互斥鎖時有多個執行緒阻塞,所有在該互斥鎖上的阻塞執行緒都會變成可執行狀態...

Linux之執行緒 互斥量mutex與死鎖

主要內容 1 互斥量及如何使用 2 什麼是死鎖,如何解決 3 什麼是讀寫鎖,如何使用 4 條件變數實現的生產消費者模型 5 訊號量實現的生產消費者模型 執行緒同步 協調步驟,順序執行。解決同步的問題 加鎖!資料混亂的原因 資源共享 獨享資源則不會 隨機排程 意味著資料訪問會出現競爭 執行緒間缺乏必要...