一種場所,兩種角色,三種關係
功能:解耦合,支援忙閒不均,支援併發
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 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...