Linux 之 條件變數

2021-10-09 10:19:39 字數 2047 閱讀 9959

pthread_cond_init函式

pthread_cond_destroy函式

pthread_cond_wait函式

pthread_cond_timedwait函式

pthread_cond_signal函式

pthread_cond_broadcast函式

以上6 個函式的返回值都是:成功返回0, 失敗直接返回錯誤號。

pthread_cond_init

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

引數

cond: pthread_cond_t 型別的條件變數

attr: 屬性,預設傳null

也可以使用靜態初始化:

pthread_cond_t cond = pthread_cond_initializer;

pthread_cond_destroy

int pthread_cond_destroy(pthread_cond_t *cond);

pthread_cond_wait

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

引數:

cond:條件變數

mutex:互斥量

在第一次呼叫之前先給mutex上鎖,呼叫pthread_cond_wait函式會將鎖釋放,並阻塞直到被喚醒,被喚醒後對mutex上鎖成功後返回,否則阻塞直到上鎖成功。

pthread_cond_timedwait

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

引數

abstime:絕對時間

struct timespec

阻塞超時後返回。

pthread_cond_signal

int pthread_cond_signal(pthread_cond_t *cond);

喚醒至少乙個條件變數。

pthread_cond_broadcast

int pthread_cond_broadcast(pthread_cond_t *cond);

喚醒全部的條件變數。

條件變數實現生產者消費者模型

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

pthread_mutex_t mutex;

pthread_cond_t cond;

queue<

int>qu;

void

str_error()

void

*fun1

(void

* arg)

return

null;}

void

*fun2

(void

* arg)

int i = qu.

front()

; qu.

pop();

printf

("consumer poped %d from queue\n"

,i);

pthread_mutex_unlock

(&mutex);}

return

null;}

intmain()

linux筆記之條件變數

條件變數的銷毀函式 條件變數等待函式 條件變數有兩個等待函式。二者的區別就在於pthread cond timedwait 比pthread cond wait 函式多了乙個引數abstime,此引數可以設定等待超時,如果達到abstime所指定的時刻,仍然沒有別的執行緒來喚醒當前執行緒,就返回et...

Linux執行緒同步之條件變數

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

linux 執行緒學習之條件變數

下面是乙個簡單的例子,我們可以從程式的執行來了解條件變數的作用。include include include pthread mutex t mutex pthread mutex initializer 初始化互斥鎖 pthread cond t cond pthread cond initia...