執行緒 條件變數 實現生產者和消費者問題

2021-08-19 05:25:06 字數 2017 閱讀 9312

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

通常和互斥量一起使用:互斥量用來保護一段共享資料,而條件變數用來引起阻塞

條件變數的倆個動作:

當條件不滿足時,阻塞執行緒

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

條件變數的型別:

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...