linux執行緒同步之條件變數

2021-09-30 15:52:29 字數 1965 閱讀 5530

條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起使用。使用時,條件變數被用來阻塞乙個執行緒,當條件不滿足時,執行緒往往解開相應的互斥鎖並等待條件發生變化。一旦其它的某個執行緒改變了條件變數,它將通知相應的條件變數喚醒乙個或多個正被此條件變數阻塞的執行緒。這些執行緒將重新鎖定互斥鎖並重新測試條件是否滿足。一般說來,條件變數被用來進行線承間的同步。

1.條件變數的結構為pthread_cond_t (相當於windows中的事件的作用)

2.條件變數的初始化

int pthread_cond_init __p ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));

其中cond是乙個指向結構pthread_cond_t的指標,cond_attr是乙個指向結構pthread_condattr_t的指標。結構 pthread_condattr_t是條件變數的屬性結構,和互斥鎖一樣我們可以用它來設定條件變數是程序內可用還是程序間可用,預設值是 pthread_ process_private,即此條件變數被同一程序內的各個執行緒使用。注意初始化條件變數只有未被使用時才能重新初始化或被釋放。

3.條件變數的釋放

釋放乙個條件變數的函式為pthread_cond_ destroy(pthread_cond_t cond)

4.條件變數的等待

(1)函式pthread_cond_wait()使執行緒阻塞在乙個條件變數上。它的函式原型為:

extern int pthread_cond_wait_p ((pthread_cond_t *__cond,pthread_mutex_t *__mutex));

執行緒解開mutex指向的鎖並被條件變數cond阻塞。執行緒可以被函式pthread_cond_signal和函式 pthread_cond_broadcast喚醒,但是要注意的是,條件變數只是起阻塞和喚醒執行緒的作用,具體的判斷條件還需使用者給出,例如乙個變數是否為0等等,這一點我們從後面的例子中可以看到。執行緒被喚醒後,它將重新檢查判斷條件是否滿足,如果還不滿足,一般說來執行緒應該仍阻塞在這裡,被等待被下一次喚醒。這個過程一般用while語句實現。

(2)另乙個用來阻塞執行緒的函式是pthread_cond_timedwait(),它的原型為:

extern int pthread_cond_timedwait_p (pthread_cond_t *__cond,

pthread_mutex_t *__mutex, __const struct timespec *__abstime);

它比函式pthread_cond_wait()多了乙個時間引數,經歷abstime段時間後,即使條件變數不滿足,阻塞也被解除。

5.條件變數的解除改變

函式pthread_cond_signal()的原型為:

extern int pthread_cond_signal_p ((pthread_cond_t *__cond));

它用來釋放被阻塞在條件變數cond上的乙個執行緒。多個執行緒阻塞在此條件變數上時,哪乙個執行緒被喚醒是由執行緒的排程策略  所決定的。要注意的是,必須用保護條件變數的互斥鎖來保護這個函式,否則條件滿足訊號又可能在測試條件和呼叫pthread_cond_wait函式之間被發出,從而造成無限制的等待。

6.下面是使用函式pthread_cond_wait()和函式pthread_cond_signal()的乙個簡單的例子。

pthread_mutex_t count_lock;

pthread_cond_t count_nonzero;

unsigned count;

decrement_count ()

increment_count()

count值為0時,decrement函式在pthread_cond_wait處被阻塞,並開啟互斥鎖 count_lock。此時,當呼叫到函式increment_count時,pthread_cond_signal()函式改變條件變數,告知 decrement_count()停止阻塞。

Linux執行緒同步之條件變數

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...

Linux執行緒同步之 條件變數

條件變數是執行緒可用的另一種同步機制。條件變數給多執行緒提供了乙個會合的場所。它主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定的條件發生。條件變數本身是互斥量保護的。執行緒在改變條...

Linux執行緒同步之條件變數

條件變數變數也是出自posix 執行緒標準,另一種執行緒同步機制,主要用來等待某個條件的發生。可以用來同步同一程序中的各個執行緒。當然如果乙個條件變數存放在多個程序共享的某個記憶體區中,那麼還可以通過條件變數來進行程序間的同步。每個條件變數總是和乙個互斥量相關聯,條件本身是由互斥量保護的,執行緒在改...