linux程式設計 執行緒 條件變數

2021-08-07 07:37:54 字數 1978 閱讀 9248

條件變數通訊機制

基本原理

初始化條件變數

int pthread_cond_init(pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr);

pthread_cond_t cond = pthread_cond_initializer;

銷毀條件變數

int pthread_cond_destroy(pthread_cond_t *cond);

通知等待條件變數的執行緒

用於喚醒等待出現與條件變數cond關聯的條件的所有執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);

用於喚醒等待出現與條件變數cond關聯的條件的第一條執行緒

int pthread_cond_signal(pthread_cond_t *cond);

等待條件變數

int pthread_cond_timedwait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex,

const struct timespec *restrict abstime);

int pthread_cond_wait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex);

如果某執行緒因等待條件變數進入等待狀態時,將隱含釋放其申請的互斥鎖。

同樣,在返回時,首先要申請到該互斥鎖物件。

程式示例:

程式處理生產消費問題,整個臨時儲存空間為2,即在任意時刻,最多能夠有2個產品存放在臨時

空間,如果已經有2個產品存放在臨時空間,將阻塞生產線程。如果臨時空間中沒有產品,顯示

需要阻塞消費執行緒。程式主要實現了生產和消費兩個執行緒同步。

#include

#include

#include

#include

#include

#define bufsize 2

struct prodcons

;void init(struct prodcons *prod)

void put(struct prodcons* prod,int data)

prod->buf[prod->writepos] = data;

prod->writepos++;

if(prod->writepos >= bufsize)

prod->writepos = 0;

pthread_cond_signal(&prod->notempty);

pthread_mutex_unlock(&prod->lock);

}int get(struct prodcons* prod)

data = prod->buf[prod->readpos];

prod->readpos++;

if(prod->readpos >= bufsize)

prod->readpos = 0;

pthread_cond_signal(&prod->notfull);

pthread_mutex_unlock(&prod->lock);

return data;

}#define over (-1)

struct prodcons buf;

void* producer(void* data)

for(n=6;n <= 10;n++)

put(&buf,over);

printf("producer stopped\n");

return null;

}void* consumer(void* data)

printf("consumer stopped\n");

return null;

}int main()

Linux多執行緒程式設計 條件變數

include int pthread cond init pthread cond t cv,const pthread condattr t cattr 返回值 函式成功返回0 任何其他返回值都表示錯誤初始化乙個條件變數。當引數cattr為空指標時,函式建立的是乙個預設的條件變數。否則條件變數的...

linux 執行緒 條件變數

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

linux 執行緒 條件變數

條件變數本身不是鎖!但它也可以造成執行緒阻塞。通常與互斥鎖配合使用。給多執行緒提供乙個會合的場所 共享的資料 主要應用函式 pthread cond init函式 pthread cond destroy函式 pthread cond wait函式 pthread cond timedwait函式 ...