linux编程:多线程之生产者与消费者模型

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;
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值