執行緒同步之條件變數

2021-09-25 21:02:26 字數 1549 閱讀 4980

1.條件變數是鎖嗎?

不是鎖,但是條件變數能夠阻塞執行緒

條件變數需要和互斥鎖一起使用

互斥量:保護一塊共享資料

條件變數:引起阻塞

2.條件變數的兩個動作?

當條件滿足,通知阻塞的執行緒執行緒開始工作

條件不滿足,阻塞執行緒

3.條件變數的型別

pthread_cond_t;

4.主要函式

初始化乙個條件變數

pthread_cond_init(

phtread_cond_t* restrict cond,

xonst pthread_condattr_t* restrict attr

);銷毀乙個條件變數

pthread_cond_destroy(pthread_cond_t * cond);

阻塞等待乙個條件變數

pthreaa_cond_wait(

pthread_cond_t *restrict cond,

pthread_mutex_t * restrict mutex

);阻塞執行緒,將已經上鎖的mutex解鎖,該函式接觸阻塞的時候,對互斥鎖繼續加鎖

限時等待乙個條件變數

pthread_cond_timedwait(

pthread_cond_t *restrict cond,

pthread_mutex_t* restrict mutex;

const struct timespec* abstime

)喚醒至少乙個阻塞在條件變數上的執行緒

pthread_cond_signal(pthread_cond_t* cond);

喚醒全部阻塞在條件變數上的執行緒

pthread_cond_broadcast(pthread_cond_t* cond);

我們用生產者和消費者來理解條件變數,當沒有產品可消費時,條件變數就會阻塞消費者這邊,等待生產者生產,當生產者生產出東西時,條件變數就會告訴消費者有東西可以消費了,消費者繼續消費。我們通過一段**來理解

#include#include#include#include#include//執行緒同步需要互斥鎖

pthread_mutex_t mutex;

//阻塞執行緒需要條件變數

pthread_cond_t cond;

typedef struct node

node;

node* head = null;

void * producer()

return null;

}void * customer()

printf("sustomer pthid = %-lu,%d\n",pthread_self(),head->data);

node*p = head->next;

free (head);

head = p;

//解鎖

pthread_mutex_unlock(&mutex);

}return null;

}int main()

執行緒同步之條件變數

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

執行緒同步之條件變數

條件變數不是鎖 名字上就沒有鎖字。但可以造成執行緒阻塞,通常與互斥鎖配合使用。1 條件變數 pthread cond t cond 2 函式 以下函式返回值均是成功返回0,失敗返回錯誤號 1 pthread cond init 動態初始化,配合phtread cond destroy一起使用。或者用...

Linux執行緒同步之條件變數

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