多執行緒間的同步與互斥

2021-08-18 11:22:26 字數 1937 閱讀 5006

多執行緒與臨界區

多執行緒想要訪問臨界區時,就要對臨界區進行上鎖,這與之前寫到的程序互斥是乙個道理,這也就是防止共享資料被併發訪問的解決方法,這種上鎖叫做互斥鎖

互斥鎖互斥鎖以排他的方式保護共享資料被併發訪問。

互斥鎖是乙個二元訊號量

互斥鎖的基本操作

條件變數

條件變數基本原理:

互斥鎖能夠解決資源的互斥訪問,但有些情況,互斥並不能解決。

例如下面這種情況,系統有全域性變數 i 和 j,執行緒a和b都要訪問,執行緒a需要互斥的執行i++;j–操作;執行緒b需要互斥的在 i 等於 j是執行do_something()函式。

如果只使用互斥鎖,可能導致do_something()永遠不會執行,因為當i=j=5時,執行緒b不一定能搶占到資源

所以,需要某個機制來解決此問題,更重要的是,執行緒b僅僅只有一種情況需要執行do_something()函式,但不停的申請釋放互斥鎖將造成資源的浪費。

在使用互斥鎖時結合條件變數解決這一問題。

這裡要注意的是,條件變數不能單獨使用,必須配合互斥鎖一起實現對資源的互斥訪問。

條件變數的基本操作

初始化和銷毀沒有什麼好說的,man一下,全清楚

那就說說signal和wait,

wait是在等乙個它要等的人(條件),這個人就是signal,signal會發乙個訊號,當signal發出訊息,wait就可以繼續執行自己的事情,否則它就一直等待

還是用生產者消費者的例子來看

生產者在生產時要上鎖保證自己的生產不被打斷,消費者也是一樣,但是消費者需要在生產者生產後,才能進行消費所以當生產者生產後要通知一下,消費者也要等著生產者的訊號

其實這就像在食堂吃飯時,我們買好飯然後就等著食堂阿姨做好了叫我們,然後阿姨(生產者)去做飯,阿姨做好飯後會叫我們

互斥鎖與條件變數的應用

建立相關變數

生產者

消費者

消費者這裡有乙個小的隱含知識:pthread_cond_wait當前應該是阻塞在這裡的,又沒有釋放鎖,那是如何讓生產者生產的?

答:如果某執行緒因等待條件變數進入等待狀態時,將隱含釋放當前的鎖,同樣,在返回時,再隱含申請到該互斥鎖物件。一會兒我們可以從結果上看到

結果讀寫鎖讀寫鎖基本原理:

在對資料的讀寫應用中,很多情況是大量的讀操作,二較少的寫操作,例如對資料庫系統資料的訪問,顯然,這時使用互斥鎖將非常影響效率。為了滿足這一情況,posix執行緒提供了讀寫鎖機制

讀寫鎖的基本操作

執行緒間的同步與互斥

臨界資源 多執行緒共享的資源流就是臨界資源 臨界區 每個執行緒內部,訪問臨界資源的 就叫做臨界區 互斥 任何時刻,互斥保證有且只有乙個執行流進入臨界區,訪問臨界資源,通常對臨界資源起保護作用 原子性 不會被任何排程機制打斷的操作,該操作只有兩態,要麼完成,要麼未完成 多執行緒併發的操作共享變數,會帶...

多執行緒同步與互斥

1.互斥 include include include include include pthread mutex t mutex pthread mutex initializer int lock var 0 time t end time void pthread1 void arg voi...

Linux 執行緒間的同步與互斥

執行緒同步 條件變數 為什麼使用條件變數?對臨界資源的時序可控性,條件滿足會通知其他等待操作臨界資源的執行緒,類似訊號。場景 t day展會排隊參觀 生產者消費者模型 條件變數是什麼?是一種同步機制,乙個執行緒用於修改這個變數使其滿足其它執行緒繼續往下執行的條件,其它執行緒則接收條件已經發生改變的訊...