C++实现线程安全的队列(生产者和消费者模型)

#include<iostream>
#include<pthread.h>
#include<queue>
using namespace std;
class BlockQueue{
public:
    BlockQueue(int ca=10):cap(ca){
        pthread_mutex_init(&_mutex,NULL);
        pthread_cond_init(&_cond_productor,NULL); 
        pthread_cond_init(&_cond_productor,NULL);   
    }

    ~BlockQueue(){
        pthread_mutex_destroy(&_mutex);
        pthread_cond_destroy(&_cond_productor);
        pthread_cond_destroy(&_cond_consumer);    
    }

    bool QueuePush(int data){
        QueueLock();
        while(QueueIsFull()){
            ProductorWait();    
        }    
        que.push(data);
        ComsumerWakeUp();
        QueueUnLock();
        return true;
    }

    bool QueuePop(int *data){
        QueueLock();
        while(QueueIsEmpty()){
            ConsumerWait();    
        }        
        *data = que.front();
        que.pop();
        ProductorWakeUp();
        QueueUnLock();
        return true;
    }

private:
    void QueueLock(){
        pthread_mutex_lock(&mutex);    
    }

    void QueueunLock(){
        pthread_mutex_unlock(&mutex);    
    }

    void ProductorWait(){
        pthread_cond_wait(&cond_productor,&_mutex);    
    }

    void ProductorWakeUp(){
        pthread_cond_signal(&cond_consumer,&_mutex);    
    }

    void ComsumerWait(){
        pthread_cond_wait(&cond_consumer,&_mutex);    
    }
    void ComsumerWakeUp(){
        pthread_cond_signal(&cond_consumer);    
    }
    bool QueueIsFull(){
        return (que.size()==cap);    
    }

    bool QueueIsEmpty(){
        return que.empty();    
    }
private:
    queue<int> que;
    int cap;
    pthread_mutex_t mutex;
    pthread_mutex_t cond_productor;
    pthread_mutex_t cond_consumer;    
};

void* thr_consumer(void*arg){
    BlockQueue *q = (BlockQueue*)arg;
    while(1){
        int data;
        q->QueuePop(&data);
        cout<<"consumer get data:"<<data<<endl;    
    }        
    return NULL;
}

void *thr_productor(void*arg){
    int i=0;
    BlockQueue *q = (BlockQueue*)arg;
    while(1){
        cout<<"productor put data:"<<i<<endl;
        q->QueuePush(i++);    
    }    
    return NULL;
}
int main(){
    pthread_t ctid[4],ptid[4];
    BlockQueue q;
    int ret;

    for(int i=0;i<4;i++){
        ret = pthread_create(&ctid[i],NULL,thr_consumer,(void*)&q);
        if(ret != 0){
            cout<<"pthread create error"<<endl;    
        }    
    }

    for(int i=0;i<4;i++){
        ret = pthread_create(&ptid[i],NULL,thr_productor,(void*)&q);
        if(ret != 0){
            cout<<"pthread create error"<<endl;    
        }    
    }

    for(int i=0;i<4;i++){
        pthread_join(ctid[i],NULL);    
    }

    for(int i=0;i<4;i++){
        pthread_join(ptid[i],NULL);    
    }
    return 0;    
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值