一、模型簡介:
生產者消費者模式就是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。這個阻塞佇列就是用來給生產者和消費者解耦的。
生產者與消費者的關係:
生產者——生產者 : 互斥;
消費者——消費者 : 互斥;
生產者——消費者 :同步與互斥。
二、模型實現分析:
二者是不同的不同角色的執行流;只需要執行中間實現執行緒安全的佇列,再通過各自建立不同的角色的執行流就可以實現這個模型。
執行緒安全阻塞佇列:stl中的佇列是非線性安全的。
三、生產者與消費者模型實現:
1. 互斥鎖與條件變數的方式實現:
①:阻塞佇列的實現:
#include
#include
#include
#include
#define max_queue 5
class
blockqueue
~blockqueue()
bool
push
(int data)
//3. 向佇列中新增乙個節點
_queue.
push
(data)
;//4. 喚醒消費者
pthread_cond_signal
(&_cond_con)
;//5. 解鎖操作
pthread_mutex_unlock
(&_mutex)
;return
true;}
// const & 表示輸入引數
// * 表示輸出引數
// & 表示輸入輸出引數
bool
pop(
int*data)
//3. 從佇列中獲取乙個節點
*data = _queue.
front()
;//獲取隊首節點
_queue.
pop();
//節點出隊
//4. 喚醒生產者
pthread_cond_signal
(&_cond_pro)
;//5. 解鎖操作
pthread_mutex_unlock
(&_mutex);}
private
: std::queue<
int> _queue;
int _capacity;
//定義佇列最大節點數量
pthread_mutex_t _mutex;
//實現互斥,保護_queue;
pthread_cond_t _cond_con;
//實現同步,消費者等待佇列
pthread_cond_t _cond_pro;
//實現同步,生產者等待佇列
};
②消費者與生產者的執行流:
#define max_thread 5
void
*thr_consumer
(void
*arg)
return
null;}
void
*thr_productor
(void
*arg)
return
null;}
intmain()
}//建立生產者執行緒
for(i =
0; i < max_thread; i++)}
//等待所有執行緒退出
for(i =
0; i < max_thread; i++
)return0;
}
2. 訊號量的方式實現:#include
#include
#include
#include
#include
#define max_queue 5
#define max_thread 5
class
ringqueue
~ringqueue()
bool
push
(int data)
bool
pop(
int*data)};
void
*thr_consumer
(void
*arg)
return
null;}
void
*thr_productor
(void
*arg)
return
null;}
intmain()
}//建立生產者執行緒
for(i =
0; i < max_thread; i++)}
//等待所有執行緒退出
for(i =
0; i < max_thread; i++
)return0;
}
生產者消費者問題之多生產者 單消費者模型
與單生產者和單消費者模型不同的是,多生產者 單消費者模型中可以允許多個生產者同時向產品庫中放入產品。所以除了保護產品庫在多個讀寫執行緒下互斥之外,還需要維護生產者放入產品的計數器,如下 include include include include include static const int ...
生產者消費者模型
1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...
生產者消費者模型
生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...