pthread cond 執行緒條件變數

2021-05-27 04:48:28 字數 3411 閱讀 2652

條件變數 pthread_cond, 另外一種執行緒間的同步機制。普通的 mutex 只允許乙個執行緒進入臨界區,就是拿到mutex這把鎖的執行緒,而cond 允許多個執行緒同時進入臨界區,由它來控制,在某些條件成立的時候,來喚醒其中乙個等待著的執行緒,或者是喚醒所有等待著的執行緒。

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

int pthread_cond_timewait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* tout)

傳遞給pthrad_cond_wait 的互斥量 mutex 對條件進行保護,呼叫者把鎖住的互斥量傳遞給pthread_cond_wait 函式,函式把呼叫執行緒放到等待條件的執行緒列表裡面,然後對互斥量解鎖,當pthread_cond_wait 返回的時候,互斥量再次被鎖住。函式 pthread_cond_timewait 與 pthread_cond_wait 差不多,只不過是多了乙個超時時間的限制。

兩個函式呼叫成功返回的時候,需要重新檢查條件,因為其他執行緒可能更改了條件。

int pthread_cond_signal(pthread_cond_t* cond);

int pthread_cond_broadcast(pthread_cond_t* cond);

pthread_cond_signal 函式將喚醒等待該條件的某個執行緒,pthread_cond_broadcast 將喚醒等待改條件的所有執行緒。

下面的例子很簡單的使用了 cond 。 使用cond 我們可以比較高效的寫出乙個 執行緒池。

1#include 

<

pthread.h

>

2#include 

<

unistd.h

>

3#include 

<

stdio.h

>

4pthread_mutex_t mutex;

5pthread_cond_t cond;

6int

val =0

;7void

*thread_zero_run(

void

*arg)

14printf(

"therad_zero_run --> val:%d, zero it and unlock\n

", val);

15val =0

; //

do  sth

16pthread_mutex_unlock(

&mutex); 

//unlock the mutex17}

18pthread_exit((

void*)

0);19}

20void

*thread_add_run(

void

*arg)

29pthread_exit((

void*)

0);30}

31int

main()

37if

(pthread_create(

&t_zero, null, thread_zero_run, null))

40pthread_join(t_add, null);

41pthread_join(t_zero, null);

42return0;

43}44

輸出:1

after add val:

1and wake up one zero thread 

forcheck

2thread_zero_run 

-->

val:

1, wait 

forwake up

3after add val:

2and wake up one zero thread 

forcheck

4thread_zero_run 

-->

val:

2, wait 

forwake up

5after add val:

3and wake up one zero thread 

forcheck

6therad_zero_run 

-->

val:

3, zero it and unlock

7thread_zero_run 

-->

val:

0, wait 

forwake up

8after add val:

1and wake up one zero thread 

forcheck

9thread_zero_run 

-->

val:

1, wait 

forwake up

10after add val:

2and wake up one zero thread 

forcheck

11thread_zero_run 

-->

val:

2, wait 

forwake up

12after add val:

3and wake up one zero thread 

forcheck

13therad_zero_run 

-->

val:

3, zero it and unlock

14thread_zero_run 

-->

val:

0, wait 

forwake up

15after add val:

1and wake up one zero thread 

forcheck

16thread_zero_run 

-->

val:

1, wait 

forwake up

17after add val:

2and wake up one zero thread 

forcheck

18thread_zero_run 

-->

val:

2, wait 

forwake up

19after add val:

3and wake up one zero thread 

forcheck

20therad_zero_run 

-->

val:

3, zero it and unlock

21thread_zero_run 

-->

val:

0, wait 

forwake up

**:

條件變數 pthread cond

posted on august 4,2013 早起翻apue,查缺補漏。書接上回,看到 條件變數 七八年前看過,有點模糊的印象。不過還是有些地方解釋不過去,看來我當年也只是 看了 但是 沒理解 根據後面的示例 enqueue msg 和process msg 因為都呼叫pthread mutex ...

python 執行緒條件

條件 事件 訊號量本質上都是鎖,不常用 常用方法 obj,acquire obj.release obj.wait 建立是阻塞狀態,等待obj.notify 並且前後要有obj.acquire 和obj.release obj.notify num 前後要有obj.acquire 和obj.rele...

POSIX執行緒 條件變數

條件變數是 posix 執行緒結構,可以讓您在遇到某些條件時 喚醒 執行緒。可以將它們看作是一種執行緒安全的訊號傳送。如果執行緒正在等待某個特定條件發生,它應該如何處理這種情況?它可以重複對互斥物件鎖定和解鎖,每次都會檢查共享資料結構,以查詢某個值。但這是在浪費時間和資源,而且這種繁忙查詢的效率非常...