條件變數和鎖的配合用法

2021-10-04 11:55:18 字數 1336 閱讀 7280

最近在看clamd的**,其中thrmgr.c中多次使用了條件變數,寫一小段**來複習一下條件變數的用法。

條件變數主要應用在多執行緒的同步,比如用於生產者消費者模型。當沒有產出的時候,為了避免消費者空轉耗費cpu,可以使用條件變數進行阻塞。在有產出的時候進行通知,進行消費。

使用中通常和互斥鎖配合使用,主要為了避免非原子操作,導致cond_wait錯過cond_signal,出現預期外的錯誤。

#include

#include

#include

pthread_mutex_t mutex;

pthread_cond_t cond;

static

void

*worker

(void

*arg)

intmain()

}sleep(1

);pthread_mutex_lock

(&mutex)

;pthread_cond_signal

(&cond)

;pthread_mutex_unlock

(&mutex)

;printf

("signal\n");

sleep(1

);pthread_mutex_lock

(&mutex)

;pthread_cond_broadcast

(&cond)

;pthread_mutex_unlock

(&mutex)

;printf

("broadcast\n");

pthread_cond_destroy

(&cond)

;pthread_mutex_destroy

(&mutex)

;}

列印的結果是

start cond wait.

start cond wait.

start cond wait.

start cond wait.

# after 1 second

signal

thread exit.

# after 1 second

broadcast

thread exit.

thread exit.

thread exit.

沒有用過條件變數的同學可能會對輸出有疑問,為什麼worker執行緒中加了鎖,其他的執行緒還能阻塞到pthread_cond_wait之前呢。原因是pthread_cond_wait包含了兩個操作,一是釋放鎖,二是等待訊號。所以,在pthread_cond_wait的時候,該執行緒是沒有上鎖的狀態。

互斥鎖和條件變數

互斥瑣 定義 指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的 上鎖 pthread mutex lock 臨界區解鎖 pthread mutex unlock 條件變數 定義 用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。等...

互斥鎖和條件變數

mutex體現的是一種競爭,我離開了,通知你進來。cond體現的是一種協作,我準備好了,通知你開始吧。互斥鎖乙個明顯的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起配合使用。使用時,條件變數被用來阻塞乙個執行緒,當...

互斥鎖和條件變數

條件變數 執行緒最大的特點就是資源的共享性,然而資源共享中的同步問題是多執行緒程式設計的難點。互斥鎖通過鎖機制來實現執行緒間的同步。使用互斥鎖前必須進行初始化操作。初始化有兩種方式 一種是靜態賦值法,將將巨集結構常量pthread mutex initializer賦給互斥鎖,操作語句如下 pthr...