多執行緒如何實現同步

2021-07-12 02:39:37 字數 1798 閱讀 2803

在多個執行緒併發執行訪問同乙個資料時,如果不採取相應的措施,將會是非常危險的。

所謂同步(synchronization)就是指乙個執行緒訪問資料時,其它執行緒不得對同乙個資料進行訪問,即同一時刻只能有乙個執行緒訪問該資料,當這一線程訪問結束時其它執行緒才能對這它進行訪問。同步最常見的方式就是使用鎖(lock),也稱為執行緒鎖。鎖是一種非強制機制,每乙個執行緒在訪問資料或資源之前,首先試圖獲取(acquire)鎖,並在訪問結束之後釋放(release)鎖。在鎖被占用時試圖獲取鎖,執行緒會進入等待狀態,直到鎖被釋放再次變為可用。

二元訊號量(binary semaphore)是一種最簡單的鎖,它有兩種狀態:占用和非占用。它適合只能被唯一乙個執行緒獨佔訪問的資源。當二元訊號量處於非占用狀態時,第乙個試圖獲取該二元訊號量鎖的執行緒會獲得該鎖,並將二元訊號量鎖置為占用狀態,之後其它試圖獲取該二元訊號量的執行緒會進入等待狀態,直到該鎖被釋放。

多元訊號量允許多個執行緒訪問同乙個資源,多元訊號量簡稱訊號量(semaphore),對於允許多個執行緒併發訪問的資源,這是乙個很好的選擇。乙個初始值為n的訊號量允許n個執行緒併發訪問

1.執行緒訪問資源時首先獲取訊號量鎖,進行如下操作:

1)將訊號量的值減1;

2)如果訊號量的值小於0,則進入等待狀態,否則繼續執行;

2.訪問資源結束之後,執行緒釋放訊號量鎖,進行如下操作:

1)將訊號量的值加1;

2)如果訊號量的值小於1(等於0),喚醒乙個等待中的執行緒;

互斥量(mutex)和二元訊號量類似,資源僅允許乙個執行緒訪問。與二元訊號量不同的是,訊號量在整個系統中可以被任意執行緒獲取和釋放,也就是說,同乙個訊號量可以由乙個執行緒獲取而由另一線程釋放。而互斥量則要求哪個執行緒獲取了該互斥量鎖就由哪個執行緒釋放,其它執行緒越俎代庖釋放互斥量是無效的。

臨界區(critical section)是一種比互斥量更加嚴格的同步手段。互斥量和訊號量在系統的任何程序都是可見的,也就是說乙個程序建立了乙個互斥量或訊號量,另一程序試圖獲取該鎖是合法的。而臨界區的作用範圍僅限於本程序,其它的程序無法獲取該鎖。除此之處,臨界區與互斥量的性質相同。

讀寫鎖(read-write lock)允許多個執行緒同時對同乙個資料進行讀操作,而只允許乙個執行緒進行寫操作。這是因為讀操作不會改變資料的內容,是安全的;而寫操作會改變資料的內容,是不安全的

對同乙個讀寫鎖,有兩種獲取方式:共享的(shared)和獨佔的(exclusive)。

1)當鎖處於自由狀態時,試圖以任何一種方式獲取鎖都能成功,並將鎖置為對應的狀態;

2)如果鎖處於共享狀態,其它執行緒以共享方式獲取該鎖,仍然能成功,此時該鎖分配給了多個執行緒;如果其它執行緒試圖如獨佔的方式獲取處於共享狀態的鎖,它必須等待所有執行緒釋放該鎖;

3)處於獨佔狀態的鎖阻止任何執行緒獲取該鎖,不論它們以何種方式。

獲取讀寫鎖的方式總結如下:

同步,多執行緒 ,多執行緒方式實現併發。

io請求幾乎不佔cpu的。同步請求相當於排隊買東西,乙個卡主了,其他的都結不了賬了。執行緒並不是越多越好,如果他特別多還不如同步高,所以對執行緒要有個限制,所以就出現了執行緒池,執行緒池在python3裡才有的,python2裡沒有的。建立程序的話是耗費很多資源的,建立執行緒是幾乎不耗費資源的。建立...

c 實現多執行緒同步

執行緒同步是指同一程序中的多個執行緒互相協調工作從而達到一致性。之所以需要執行緒同步,是因為多個執行緒同時對乙個資料物件進行修改操作時,可能會對資料造成破壞,下面是多個執行緒同時修改同一資料造成破壞的例子 1 include 2 include 3 4void fun 1 unsigned int ...

多執行緒同步

synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...