生产者与消费者模式:
一种设计模式–针对典型场景设计的解决方案。
一个场景,两种角色,三种关系。
生产者与消费者模型针对这种场景所解决的问题:
a.解耦合(生产者与消费者不再直接进行数据交互)
b.支持并发(支持多个生产者、消费者)
c.支持忙闲不均(可以将数据放到缓冲带缓存,避免来不及处理的情况)
生产者与消费者模型的实现:
生产者与消费者只是不同角色的执行流。
只需要中间实现线程安全的队列,然后再各自创建不同角色的执行流就可以实现这个模型。
线程安全阻塞队列的实现:
用C++封装实现一个阻塞队列类::stl中我们学习了队列容器 std::queue。但是这个队列是非线程安全。
class BlockQueue
{
private:
std::queue<int> _queue;//stl中queue
int _capcity;//定义队列在最大的节点数量
pthread_mutex_t _mutex;//互斥锁保护临界资源queue的访问
pthread_cond_t _cond_con;//消费者等待队列,实现同步
pthread_cond_t _cond_pro;//生产者等待队列,实现同步
public:
BlockQueue(int max_que=MAX_QUEUE){…初始化过程…}
~BlockQueue(){…资源销毁过程…}
bool Push(int data);//生产者入队操作
bool Pop(int *data);//消费者出队操作
}
#include <cstdio>
#include <iostream>
#include <queue>
#include <pthread.h>
#define MAX_QUEUE 5
class BlockQueue
{
public:
BlockQueue(int max = MAX_QUEUE):_capacity(max){
pthread_mutex_init(&_mutex, NULL);
pthread_cond_init(&_cond_con, NULL);
pthread_cond_init(&_cond_pro, NULL);
}
~BlockQueue(){
pthread_mutex_destroy(&_mutex);
pthread_cond_destroy(&_cond_con);
pthread_cond_destroy(&_cond_pro);
}
bool Push(int data) {
//入队的操作,肯定是生产者
//1. 加锁操作
pthread_mutex_lock(&_mutex);
//2. 判断队列是否满了
while (_queue.size() == _capacity) {
//若不满足(队列已经满了),