執行緒(一)執行緒的鎖與同步

2021-06-06 01:55:52 字數 1251 閱讀 5122

1.如何避免死鎖

當兩個執行緒需要兩個互斥量,如執行緒一鎖住互斥量a需要互斥量b,但執行緒二鎖住互斥量b需要互斥量a,那麼就會發生死鎖。解決方法1)控制互斥量的枷鎖順序,即不上上述情況發生。2)如果程式複雜,那麼可以嘗試先施放當前鎖,過一段時間在試試。可用pthread_mutex_trylock函式,此函式當鎖乙個互斥量不成功的時候會立即的返回,而不會像pthread_mutext_lock一樣阻塞,如果返回不成功那麼可以先釋放以前鎖住的互斥量,做好清理工作,過一段時間在來嘗試。

2.鎖粒度的問題

在枷鎖的時候,要考慮鎖的粒度,如果鎖的粒度太大,可能會出現很多的執行緒等待同乙個鎖的情況,那麼源自併發性的改善微乎其微。如果粒度太小,那麼過多的鎖開銷會使系統的效能受到嚴重的影響,而且**變得相當的複雜,在滿足鎖需求的情況下,**複雜度和優化效能之前要找好平衡點。

3.mutex與rwlock

在一定的條件下,讀寫鎖比互斥量允許更高的並行性,互斥量只有兩種狀態,枷鎖和不加鎖,但是讀寫鎖有三種狀態,讀模式下加鎖,寫模式下加鎖,和不加鎖。一次只有乙個程序可以占有寫模式的讀寫鎖,但是多個執行緒可以同時占有讀模式的讀寫鎖。執行緒如果希望以寫模式加鎖的時候,那麼它必須阻塞直到所有的執行緒都釋放讀鎖(這就保證了讀出來的資料的一致性),但是當有寫模式鎖請求的時候,會阻塞以後的讀模式鎖的請求防止讀模式鎖被長期占用而寫模式的鎖得不到請求。適用於對資料結構讀得次數遠大於寫的次數的情況,當任務頻繁的時候,讀任務次數很多,因為使用讀模式的鎖,可以同時讀取任務,所以可以明顯提高速度,而不用使得執行緒處於阻塞的狀態。

讀寫鎖乙個具體的應用如下,任務佇列會一次新增大量的任務,每個任務都有乙個id,每個id不同且增長,每個任務還有乙個執行緒id的屬性,那麼主線程可以預先建立一批執行緒,並且把執行緒的tid儲存下來,在分發任務的時候加上執行緒的tid。而預先建立的執行緒可以從頭到尾的讀取主線程的任務佇列,並且記錄下已經完成任務id的最大值,當task的tid與自己tid相等,且task的id大於儲存的id的時候處理這個任務。(這樣,不同的tid的執行緒,任務可以不同,還可以同時讀取任務)。

這裡的「讀」是只從佇列中讀取,並不刪除佇列的內容,刪除佇列的內容的時候也需要寫鎖。

4.cond

5.執行緒安全

如果乙個函式在同一時刻可以被多個執行緒安全的呼叫,那麼就說這個函式是執行緒安全的。大多數的函式是執行緒安全的,但是作業系統裡有一部分函式不是的。

6.執行緒中呼叫fork

在乙個程序中,有多個執行緒,其中的乙個執行緒呼叫fork的話,產生的子程序如果不立即呼叫exec的話,就需要清理狀態鎖,因為子程序內部只有乙個執行緒,它是由父程序呼叫fork的執行緒副本構成的。

Qt多執行緒基礎(一)執行緒同步之互斥鎖同步

一 直接使用qmutex進行同步 建立執行緒方法 繼承自qthread,重寫void run 函式,呼叫成員start 啟動執行緒,start 中可加入優先順序引數。互斥鎖同步方法 void run 函式中使用qmutex來實現同步,當多個執行緒訪問共享變數時,應使用lock trylock和unl...

執行緒同步與鎖

二元訊號量和多元訊號量,是乙個變數,獲取 1,釋放 1,當變數處於 0的情形下才可以被獲取。乙個執行緒的獲取可以用另乙個執行緒來釋放。很像二元訊號量,但是釋放只能是本執行緒。臨界區是比互斥量更加嚴格的同步手段,訊號量和互斥量可以不同程序之間操作,也就是說 乙個程序建立了乙個互斥量或訊號量,另乙個程序...

執行緒同步與鎖

為了避免多個執行緒對同乙個資料進行讀寫,我們要將各個執行緒進行同步。所謂同步,就是指在乙個執行緒訪問資料未結束的時候,其他執行緒不得對同一資料進行訪問。同步最常用的方法是鎖。是最簡單的一種鎖,只有兩種狀態 占用和非占用。她適合只能被唯一乙個執行緒獨佔訪問的資源。允許多個執行緒併發訪問的資源適合使用訊...