生产者消费者问题是面试常见的题,如何用两个线程实现对于一个队列的生产者消费者模型呢?
//这是生产者消费者模型的代码
#include<iostream>
#include<queue>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
using namespace std;
class MyQueue
{
private:
std::queue<int> q;
int cap;//共享缓冲区容量
pthread_mutex_t mutex;//锁
pthread_cond_t full;//生产者条件变量
pthread_cond_t empty;//消费者条件变量
public:
MyQueue(int _cap = 10) :cap(_cap) //初始化条件变量,以及队列缓冲区大小
{
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&full, NULL);
pthread_cond_init(&empty, NULL);
}
void PushData(const int &data)
{
//首先对共享变量加锁
pthread_mutex_lock(&mutex);
//如果当前的队列满了
while (q.size() == cap)
{
pthread_cond_signal(&empty);//通知消费者线程,当前满了,可以来取
cout << "the queue is full, please let consumer comsume and stop producting" << std::endl;
pthread_cond_wait(&full, &mutex);//生产者进入等待队列
}
//队列不满,生产者插入数据,通知消费者队列中已经有数据了
q.push(data);
pthread_cond_signal(&empty);
//去锁
pthread_mutex_unlock(&mutex);
}
void PopData(int &data)
{
pthread_mutex_lock(&mutex);
while (q.size() == 0) //当前队列为空
{
pthread_cond_signal(&full);
cout << "queue is empty, please let produter producing and stop consuming" << std::endl;
pthread_cond_wait(&empty, &mutex);//消费者进入等待队列
}
//队列不为空
data = q.front();
q.pop();
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
}
~MyQueue()
{
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&full);
pthread_cond_destroy(&empty);
}
};
//消费者
void* consumer(void* arg)
{
MyQueue *bqp = (MyQueue*)arg;
int data;
while (1)
{
bqp->PopData(data);
cout << "Consuming data: " << data << endl;
}
}
//生产者
void* producter(void* arg)
{
MyQueue *bqp = (MyQueue*)arg;
while(1)
{
int data = rand() % 1024;
bqp->PushData(data);
cout << "Producting data: " << data << endl;
}
}
int main()
{
MyQueue mq;
pthread_t con;
pthread_t pro;
pthread_create(&con, NULL, consumer, (void*)&mq);
pthread_create(&pro, NULL, producter, (void*)&mq);
pthread_join(con, NULL);
pthread_join(pro, NULL);
return 0;
}