條件變數不是鎖,但是條件變數能夠阻塞執行緒
通常和互斥量一起使用:互斥量用來保護一段共享資料,而條件變數用來引起阻塞
條件變數的倆個動作:
當條件不滿足時,阻塞執行緒
當條件滿足,通知阻塞的執行緒開始工作
條件變數的型別:
pthread_cond_t cond;
初始化乙個條件變數--condtion
pthread_cond_init(
pthread_cond_t*restrict cond,
constpthread_condattr_t *restrict attr
銷毀乙個條件變數
pthread_cond_destroy(pthread_cont_t *cond);
阻塞乙個條件變數
pthread_cond_wait( pthread_cond_t *restrictcond,pthread_mutex_t *restrict mutex);
限時等待乙個條件變數
pthread_cond_timedwait(
pthread_cond_t*restrict cond,
pthread_mutex_trestrict mutex,
conststruct timespec *restrict abstime
喚醒至少乙個阻塞在條件變數上的執行緒
pthread_cond_signal(pthread_cond_t *cond);
喚醒全部阻塞在條件變數上的執行緒
pthread_cond_broadcast(pthread_cond_t*cond);
如燒餅問題,生產者在一直的生產燒餅,而消費者不斷的消費燒餅,如果燒餅沒有了,則消費者會等待生產者生產,生產過後會通知消費者進行消費
其中mutex的值的會發生改變
加入消費者開始消費,此時mutex值為1,當pthread_mutex_lock加鎖後,mutex值變為0,如果沒有燒餅,執行pthread_cond_wait發生阻塞,因為這個函式中也有mutex引數,此時將mutex值變為1,相當於解鎖,那麼生產者就會加鎖成功,開始生產,生產後,pthread_mytex_unlock會使mutex值變為1,執行pthread_cond_signal函式,這個函式會喚醒阻塞在條件變數上的執行緒,也就是pthread_cond_wait此時解除了阻塞,同時加鎖,mutex變為0
用無頭節點的鍊錶來實現生產者消費者問題(生產用頭插法,消費用頭刪法)
#include #include #include #include #include //節點結構
typedef struct node
node;
//永遠指向鍊錶頭部的指標
node *head=null;
//生產者
//執行緒同步--互斥鎖
pthread_mutex_t mutex;
//阻塞執行緒--條件變數型別的變數
pthread_cond_t cond;
void *producer(void *sig)
return null;
}void *customer(void *arg)
//鍊錶不為空,刪掉乙個節點,刪除頭節點 《當作消費者》
node *pdel=head;
head=head->next;
printf("-----customer %x ,%d\n",(unsigned int)pthread_self(),pdel->data);
free(pdel);
//解鎖
可以看出生產者和消費者之間的乙個同步
生產者消費者執行緒
include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...
生產者消費者執行緒
該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...
c 執行緒實現生產者消費者
public inte ce ithreadworker idisposable public class threadcontroller public threadcontroller int maxthreadcount this maxthreadcount,string.empty pub...