Linux 互斥與同步

2021-10-02 03:44:07 字數 1044 閱讀 3416

使用互斥鎖之前必須要建立乙個鎖的物件。互斥鎖的型別為pthread_mutex_t,建立乙個變數就是建立了乙個互斥鎖,我們通過這個變數建立開鎖和解鎖的聯絡。但這個鎖還不能夠直接使用,需要對其進行初始化。

我們對建立好的鎖進行初始化的方法有兩種

第二個引數attr:如果傳入null,互斥鎖的屬性設定為預設

我們可以將獲取互斥鎖理解成建立互斥關係,即當你獲取鎖(建立互斥關係)之後,直到你釋放鎖(銷毀互斥關係)這個時間段內,別人都不能對你加鎖的資料訪問。也就是說在獲取鎖和釋放鎖區間的操作,每次只能有一線程訪問。

這個操作是阻塞的,當互斥關係已經被建立時pthread_mutex_lock()會進入鎖的等待佇列中,並且進入阻塞狀態,直到其他執行緒解除互斥關係(釋放鎖),輪到自己建立互斥關係時,才返回;當獲取鎖失敗時,該執行流會被放在互斥鎖的pcb等待佇列中

如果已經有執行緒建立互斥關係,則直接返回,如果沒有執行緒建立互斥關係,則自己建立互斥關係(獲取鎖)。

當我們使用完臨界資源時,需要釋放互斥鎖,否則該資源別的執行流不能使用

通過pthread_mutex_udestroy(&mtx)銷毀乙個鎖後,執行緒鎖的狀態變為「未定義」。乙個被銷毀的執行緒鎖可以再次被pthread_mutex_init()初始化。對於被銷毀的執行緒鎖,對其進行操作的結果是未定義的。盡量避免對於乙個處於鎖定狀態的執行緒鎖進行銷毀操作。(銷毀開闢的等待佇列等資源)

pthread_cond_t cond;

和互斥鎖一樣,條件變數也需要初始化,我們有兩種方式

int pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);

int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);

注意:int pthread_cond_signal(pthread_cond_t* cond);

注意

Linux 執行緒同步與互斥

多個執行緒併發的操作共享變數,會帶來 些問題。假設兩個執行緒讀寫相同變數時,執行緒a讀取變數然後給這個變數賦予乙個新的值,但寫操作需要兩個儲存週期。當執行緒b在這兩個寫週期讀取這個變數時,可能會得到不一致的值。為了避免這個問題,就需要互斥,同一時間只允許乙個執行緒訪問該變數。假設乙個場景,現有100...

同步與互斥

雖然多個程序可以共享系統中的各種資源,但其中許多資源一次只能為乙個程序所使用,我們把一次僅允許乙個程序使用的資源稱為臨界資源。許多物理裝置都屬於臨界資源,如印表機等。此外,還有許多變數 資料等都可以被若干程序共享,也屬於臨界資源。對臨界資源的訪問,必須互斥地進行,在每個程序中,訪問臨界資源的那段 稱...

同步與互斥

在多道程式系統中,由於程序併發,資源共享與程序協作,使得程序間可能產生兩種形式的制約 1 間接相互制約 源於資源共享,如果程序ab共享一種資源,如果a請求資源時發現程序b正在訪問這種資源,那麼程序a就進入阻塞佇列,當程序b釋放資源,程序a被喚醒到就緒狀態 2 直接相互制約 源於程序協作,如果程序a通...