當乙個執行緒互斥地訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。
例如 : 乙個執行緒訪問佇列時,發現隊列為空,它只能等待,直到其它執行緒將乙個節點新增到佇列中。類似這種情況就需要用到條件變數。
同步概念與競態條件 :
同步:在保證資料安全的前提下,讓執行緒能夠按照某種特定的順序訪問臨界資源,從而有效避免飢餓問題,叫做同步
競態條件:因為時序問題,而導致程式異常,稱之為競態條件。
條件變數函式 :
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...