執行緒同步之條件變數

2021-10-03 17:22:01 字數 2392 閱讀 9768

條件變數不是鎖(名字上就沒有鎖字。。。),但可以造成執行緒阻塞,通常與互斥鎖配合使用。

1、條件變數 

pthread_cond_t  cond;

2、函式

以下函式返回值均是成功返回0,失敗返回錯誤號

1)pthread_cond_init;//動態初始化,配合phtread_cond_destroy一起使用。

或者用pthread_cond_t  cond = pthread_cond_initializer;(這樣就是靜態初始化了。)

這樣就不用phtread_cond_destroy了。

2)pthread_cond_destroy;

3)pthread_cond_wait

4)pthread_cond_timedwait

5)pthread_cond_signal

6)pthread_cond_broadcast

3、pthread_cond_wait函式分析:

1)函式原型

#include

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

2)函式作用:

a.阻塞等待乙個條件變數cond滿足條件,即:滿足條件執行,不滿足阻塞。

b.釋放已經掌握的互斥鎖,即相當於phread_mutex_unlock(&mutex);a,b步驟為乙個原子操作,即不能分開,同時完成。(所以,需呼叫此函式前,需要對mutex進行初始化和加鎖,對cond進行初始化)

c.被喚醒,pthread_cond_wait函式返回前,解除阻塞,並重新申請獲取互斥鎖pthread_mutex_lock(&mutex);

(因為b中解鎖了嘛,所以此處需要重新拿鎖)

使用phtread_cond_signal函式或者phtread_cond_broadcast來喚醒:

phtread_cond_signal函式能夠喚醒阻塞在條件變數上至少乙個執行緒。

phtread_cond_broadcast函式能夠喚醒所有阻塞在條件變數上的執行緒。

4、以生產者消費者模型舉例:

typedef structnode;

pthread_mutex_t mutex = pthread_mutex_initialiizer;

pthread_cond_t cond = pthread_cond_initialiizer;

node* head = null;

node* p = null;

void* productor(void*arg)

}void* consumer(void*arg)

p = head;

head = p->next;

pthread_mutex_unlock(&mutex);

printf("consurmer%d\n",p->value);

free(p);

p= null;

sleep(rand()%3);

}}int main()

生產者:生產了共有資源(如上:鍊錶中增加資料),呼叫pthread_cond_signal();來喚醒乙個等待條件變數的執行緒;

消費者:消費共有資源(如上,鍊錶中刪除資料),首先呼叫pthread_cond_wait(),來等待條件變數,倘若生產者執行緒已經先執行,生產了資料,呼叫pthread_cond_signal(),消費者執行緒將不會阻塞直接拿鎖往下進行;倘若消費者執行緒先執行了,資料還沒有生產出來,消費者執行緒就會阻塞。

總結:

1)、消費者中的條件一直滿足的時候,條件變數不發揮作用;

2)、條件變數的意義是使 消費者執行緒在條件不滿足的時候,讓執行緒處於阻塞態,消費者執行緒條件滿足時會收到生產者的signal訊號,取消阻塞,繼續往下執行。

5、pthread_cond_timedwait(*,*,*)函式的使用//三個引數都是指標

pthread_cond_timedwait()函式有三個引數:

(1)pthread_cond_t __cond:條件變數(觸發條件)

(2)pthread_mutex_t __mutex: 互斥鎖

(3)struct timespec __abstime: 等待時間(其值為系統時間 + 等待時間)

abstime絕對時間的演算法:從linux元年開始算的1970/1/1/00:00:00

time_t  cur= time(null);//獲取當前時間

struct timespec t;

t.tv_sec = cur+10;//定時10s

pthread_cond_timedwait(&cond,&mutex,&t);

執行緒同步之條件變數

程序空間中有乙個儲存量a,該程序空間內存在多個執行緒,這多個執行緒都會訪問到a,或讀或寫,為了保障每個執行緒當前讀到的是正確的a而不是別的執行緒正在修改過程中的a,我們在訪問a之前需要對a進行加鎖,使得我們在訪問a的時候別的執行緒禁止訪問a,這是互斥量鎖。或者允許多個執行緒同時讀a,這是讀寫鎖。還有...

執行緒同步之條件變數

1.條件變數是鎖嗎?不是鎖,但是條件變數能夠阻塞執行緒 條件變數需要和互斥鎖一起使用 互斥量 保護一塊共享資料 條件變數 引起阻塞 2.條件變數的兩個動作?當條件滿足,通知阻塞的執行緒執行緒開始工作 條件不滿足,阻塞執行緒 3.條件變數的型別 pthread cond t 4.主要函式 初始化乙個條...

Linux執行緒同步之條件變數

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