天天看點

互斥鎖和條件變量總結&接口介紹【pthread_mutex_init/lock/trylock/unlock/destroy】【pthread_cond_init/wait/timedwait/..】0 - 前言1 - 互斥鎖2 - 條件變量

文章目錄

  • 0 - 前言
  • 1 - 互斥鎖
    • 1-1 初始化鎖
    • 1-2 加鎖
    • 1-3 解鎖
    • 1-4 銷毀鎖
  • 2 - 條件變量
    • 2-1 初始化條件變量
    • 2-2 等待條件變量
    • 2-3 喚醒線程
    • 2-4 銷毀條件變量

0 - 前言

本文主要總結互斥鎖和條件變量的關鍵接口

參考:

C語言技術網-線程同步

條件變量

1 - 互斥鎖

互斥鎖時對于互斥資源(也叫臨界資源)來說的,比如說有一個公共賬戶,有很多人都想對這個賬戶進行操作(存錢、取錢),為了保護賬戶操作的穩定,使用一種保障機制來保證同一時刻隻有一個人操作賬戶。這種保障機制就是互斥鎖。

每個臨界資源對應一個互斥鎖,多個線程都想擷取臨界資源的使用權時,必須先獲得互斥鎖,鎖定臨界資源後,才能對臨界資源進行操作。

互斥鎖的類型為:pthread_mutex_t

1-1 初始化鎖

1-2 加鎖

加鎖分為阻塞加鎖與非阻塞加鎖兩種

阻塞加鎖:

如果是鎖是空閑狀态,本線程将獲得這個鎖;如果鎖已經被占據,本線程将排隊等待,直到成功的擷取鎖。

非阻塞加鎖:

該函數語義與 pthread_mutex_lock() 類似,不同的是在鎖已經被占據時立即傳回 EBUSY(一種錯誤類型),而不是挂起等待。

1-3 解鎖

1-4 銷毀鎖

銷毀鎖之前,鎖必需是空閑狀态(unlock),否則傳回EBUSY

2 - 條件變量

條件變量是用來等待線程而不是上鎖的,條件變量通常和互斥鎖一起使用。條件變量之是以要和互斥鎖一起使用,主要是因為互斥鎖的一個明顯的特點就是它隻有兩種狀态:鎖定和非鎖定,而條件變量可以通過允許線程阻塞和等待另一個線程發送信号來彌補互斥鎖的不足,是以互斥鎖和條件變量通常一起使用

條件變量的類型為:pthread_cond_t

2-1 初始化條件變量

2-2 等待條件變量

分為阻塞等待與**非阻塞等待(也叫限時等待)**兩種

阻塞等待:

pthread_cond_wait() 用于阻塞目前線程,等待别的線程使用 pthread_cond_signal() 或 pthread_cond_broadcast來喚醒它 。

pthread_cond_wait() 必須與pthread_mutex 配套使用。 pthread_cond_wait()函數一進入wait狀态就會自動release mutex。當其他線程通過pthread_cond_signal()或pthread_cond_broadcast,把該線程喚醒,使pthread_cond_wait()通過(傳回)時,該線程又自動獲得該mutex。

也就是說,pthread_cond_wait函數成功傳回時,内部完成了三件事:

1、釋放互斥鎖:剛調用該函數,使線程進入等待

2、等待條件變量:線程開始等待。當另一個線程改變條件變量,滿足觸發條件時,正在等待的這個線程進入第3步

3、條件觸發,互斥鎖加鎖:本線程對臨界資源加鎖,開始自己的操作(等了這麼久,終于輪到我對臨界資源操作了)

限時等待:

2-3 喚醒線程

喚醒阻塞在條件變量上的線程

pthread_cond_signal 函數的作用是發送一個信号給另外一個正在處于阻塞等待狀态的線程,使其脫離阻塞狀态,繼續執行。如果沒有線程處在阻塞等待狀态,pthread_cond_signal也會成功傳回

pthread_cond_broadcast() 喚醒全部阻塞在條件變量上的線程

2-4 銷毀條件變量

隻有在沒有線程在該條件變量上等待時,才可以登出條件變量,否則會傳回EBUSY

繼續閱讀