生產者與消費者模型

2021-09-27 05:57:44 字數 3573 閱讀 2091

一種場所,兩種角色,三種關係

功能:解耦合,支援忙閒不均,支援併發

stl–std::queue—非執行緒安全

class blockqueue

queuepush(int data);//整合執行緒安全的入隊操作

queuepop(int* data);//整合執行緒安全的出隊操作

手撕生產者與消費者模型

實現執行緒安全的佇列,對提供執行緒安全的資料入隊和出隊操作

建立執行緒,分別作為生產者與消費者資料入隊或資料出隊

#include

#include

#include

#define max_queue 10

class blockqueue

~blockqueue()

void

queuepush

(int data)

_queue.

push

(data)

;conwakeup()

;queueunlock()

;}void

queuepop

(int

*data)

*data=_queue.

front()

;//獲取佇列頭節點

_queue.

pop();

//節點出隊

prowakeup()

;queueunlock()

;}private:

void

queuelock()

//加鎖

void

queueunlock()

//解鎖

void

conwait()

//消費者等待

void

conwakeup()

//喚醒消費者

void

prowait()

//生產者等待

void

prowakeup()

//喚醒生產者

bool queueisfull()

//判斷佇列是否滿了

bool queueisempty()

//判斷佇列是否為空

private:

std:

:queue<

int> _queue;

//stl容器中的佇列

int _capacity;

//佇列節點最大數量

//執行緒安全實現成員

pthread_mutex_t mutex;

pthread_cond_t cond_pro;

pthread_cond_t cond_con;};

void

*thr_consumer

(void

*arg)

return

null;}

int i=0;

pthread_mutex_t mutex;

void

*thr_productor

(void

*arg)

return

null;}

intmain()

}for

(i=0

;i<

4;i++)}

for(i=

0;i<

4;i++

)return0;

}

通過自身的計數器實現條件判斷,當條件滿足時則直接返回並且計數-1,當條件不滿時則阻塞

當產生資源後,通過訊號的喚醒功能喚醒等待並且計數+1

訊號量的條件判斷由自身來完成,而條件變數的條件判斷由使用者完成

訊號量並不搭配互斥鎖使用,而條件變數需要搭配互斥鎖一起使用保護條件的改變

訊號量操作步驟:

1.sem_t

定義2.sem_init

初始化3.sem_wait

計數判斷是否阻塞 -1

4.sem_post

計數+1,喚醒阻塞

5.sem_destory

銷毀

ringqueue

int sem_init(sem_t* sem,int pshared,unsigned int value);//初始化訊號量初值

int sem_wait(sem_t* sem);//對計數進行判斷,計數<=0則阻塞,否則立即返回流程繼續計數-1

int sem_post(sem_t* sem);//對計數進行+1,並且喚醒等到的執行緒

sem wait(sem_space) //空閒空間計數-1

sem_post(sem_spcae) //空閒空間計數+1

sem_post(sem data) //資料資源計數+1

sem_wait(sem_data) //資料資源計數-1

/*使用訊號量實現生產者與消費者模型*/

#include

#include

#include

#include

class ringqueue

~ringqueue()

void

queuepush

(int data)

void

queuepop

(int

*data)

private:

std:

:vector<

int> _queue;

int _capacity;

int _step_write;

int _step_read;

sem_t _sem_lock;

//實現互斥鎖

sem_t _sem_space;

//空閒空間計數

sem_t _sem_data;

//資料資源計數};

void

*thr_productor

(void

* arg)

return

null;}

void

*thr_consumer

(void

* arg)

return

null;}

intmain()

for(i=

0;i<

4;i++)}

for(i=

0;i<

4;i++

)pthread_join

(ptid,

null);

return0;

}

生產者與消費者模型

先介紹幾個函式 生產消費者模型 二者共享資料value,這裡,生產者是producter,消費者是consumer。生產者負責放物品到value中,消費者使用wait 等待生產者的通知。當得到通知後,消費者取出物品,並且用notify 通知生產者,可以再放下一批物品。例項 package cn.ed...

生產者與消費者模型

如圖 一共有三種關係 生產者與生產者的互斥關係,消費者與消費者的互斥關係,生產者與消費者的互斥且同步關係。兩種角色 生產者 執行緒 與消費者 執行緒 乙個交易場所 倉庫 一段記憶體空間,且可存可取 二 基於單向鍊錶的生產者消費者模型 1 我們這裡用乙個單鏈表當做那段共享記憶體,簡單實現生產者消費者模...

生產者與消費者模型

生產者 消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,模型圖如下所示 1 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...