Linux 條件變數

2021-09-09 06:24:50 字數 1529 閱讀 6977

當乙個執行緒互斥地訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。

例如 : 乙個執行緒訪問佇列時,發現隊列為空,它只能等待,直到其它執行緒將乙個節點新增到佇列中。類似這種情況就需要用到條件變數。

同步概念與競態條件 :

同步:在保證資料安全的前提下,讓執行緒能夠按照某種特定的順序訪問臨界資源,從而有效避免飢餓問題,叫做同步

競態條件:因為時序問題,而導致程式異常,稱之為競態條件。

條件變數函式 :

int

pthread_cond_init

(pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr)

;

引數:cond —> 要初始化的條件變數

attr —> null

int

pthread_cond_destroy

(pthread_cond_t *cond)

int

pthread_cond_wait

(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex)

;

引數 :cond —> 要在這個條件變數上等待 (等待掛起)

mutex —> 互斥量,後面詳細解釋 (釋放鎖)

int

pthread_cond_broadcast

(pthread_cond_t *cond)

;int

pthread_cond_signal

(pthread_cond_t *cond)

;

broadcast :喚醒多個被掛起的執行緒 (易引起驚群問題)

signal : 喚醒等待佇列裡的第乙個執行緒

簡單案例:

#include

#include

#include

#include

#include

#include

#include

pthread_mutex_t lock;

pthread_cond_t cond;

void

*thread_run

(void

*arg)

}void

*thread_signal

(void

*arg)

}int

main()

執行結果:

linux條件變數

linux條件變數 條件變數 條件變數是利用執行緒間共享是全域性變數進行同步的一種機制。條件變數巨集觀上類似if語句,符合條件就能執行某段程式,否則只能等待條件成立。一 函式 pthread cond init函式 初始化條件變數 pthread cond wait函式 基於條件變數阻塞,無條件等待...

Linux 條件變數

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的,乙個條件變數對應乙個等待佇列。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 喚醒執行緒。1 pthread cond t cond ...

Linux 條件變數

條件變數 1.問題 某些情況下,某些執行緒有這個需求 僅當滿足某個特定條件時,才執行對應操作 如果該條件不滿足,就阻塞該執行緒,一直等到對應的條件滿足才繼續執行。解決方案 當條件滿足時,使用訊號量喚醒對應執行緒,當條件不滿足時,使用訊號量阻塞對應執行緒。並用互斥量 互斥鎖 來保護對該條件的訪問。li...