linux编程:多线程之生产者与消费者模型
生产者与消费者模型中的生产者主要负责向队列中存放数据,并且唤醒消费者来取,消费者主要负责取队列中存放的数据,并且在队列不满时唤醒生产者来存数据。示例中创建了4个生产者线程,4个消费者线程。
#include <iostream>
#include <queue>
#include <pthread.h>
#include <cstdio>
#define MQX_QUEUE 5
class BlockQueue{
std::queue<int> _queue;
int _capacity;
pthread_mutex_t _mutex;
pthread_cond_t _cond_pro;
pthread_cond_t _cond_cus;
public:
BlockQueue(int cap=MQX_QUEUE):_capacity(cap){
pthread_mutex_init(&_mutex,NULL);
pthread_cond_init(&_cond_pro,NULL);
pthread_cond_init(&_cond_cus,NULL);
}
~BlockQueue(){
pthread_mutex_destroy(&_mutex);
pthread_cond_destroy(&_cond_pro);
pthread_cond_destroy(&_cond_cus);
}
bool Push(int data){
pthread_mutex_lock(&_mutex);
while(_queue.size()==_capacity){
pthread_cond_wait(&_cond_pro,&_mutex);
}
_queue.push(data);
pthread_mutex_unlock(&_mutex);
pthread_cond_signal(&_cond_cus);
return true;
}
bool Pop(int *data){
pthread_mutex_lock(&_mutex);
while(_queue.empty()){
pthread_cond_wait(&_cond_cus,&_mutex);
}
*data=_queue.front();
_queue.pop();
pthread_mutex_unlock(&_mutex);
pthread_cond_signal(&_cond_pro);
return true;
}
};
void *thr_cus(void* arg){
BlockQueue *queue = (BlockQueue*)arg;
while(1){
int data;
queue->Pop(&data);
printf("get data:%d --\n",data);
}
return NULL;
}
void *thr_pro(void* arg){
BlockQueue *queue = (BlockQueue*)arg;
int data= 0;
while(1){
queue->Push(data);
printf("get data:%d ++\n",data++);
}
return NULL;
}
int main(){
int ret,i;
BlockQueue queue;
pthread_t ctid[4],ptid[4];
for(i=0;i<4;i++){
ret=pthread_create(&ctid[i],NULL,thr_cus,(void*)&queue);
if(ret!=0){
printf("craete theread error\n");
return -1;
}
}
for(i=0;i<4;i++){
ret=pthread_create(&ptid[i],NULL,thr_pro,(void*)&queue);
if(ret!=0){
printf("craete theread error\n");
return -1;
}
}
for(i=0;i<4;i++){
pthread_join(ctid[i],NULL);
pthread_join(ptid[i],NULL);
}
return 0;
}
运行结果