linux 生产者消费者问题 c++

条件锁解决问题

#include<stdio.h>

#include<stdlib.h>

#include<pthread.h>

#include<iostream>

#include<unistd.h>

#include<semaphore.h>

using namespace std;

const int BUFFER_LENGTH=10;

int buffer[BUFFER_LENGTH];

int front=0;

int rear=-1;

int size=0;

int add=0;

pthread_mutex_t mutex;

pthread_cond_t empty_cond;

pthread_cond_t full_cond;

bool producer_wait=false;

bool consumer_wait=false;

void *producer(void*arg){

   while(true){

      if(add>=10){

        break;

      }

     pthread_mutex_lock(&mutex);

      if(size==BUFFER_LENGTH){

        cout<<"buffer is full. producer iswaiting"<<endl;

        add++;

        cout<<endl;

        producer_wait=true;

        pthread_cond_wait(&full_cond,&mutex);

        producer_wait=false;

      }

     rear=(rear+1)%BUFFER_LENGTH;

     buffer[rear]=rand()%BUFFER_LENGTH;

     cout<<"producer produces the item"<<rear<<":"<<buffer[rear]<<endl;

      ++size;

     sleep(1);

      if(size==1){

        while(true){

           if(consumer_wait){

              pthread_cond_signal(&empty_cond);

              break;

           }

        }

      }

     pthread_mutex_unlock(&mutex);

   }

}

void *consumer(void*arg){

   while(true){

     if(add>=10){

       break;

     }

    pthread_mutex_lock(&mutex);

     if(size==0){

       cout<<"buffer is empty. consumer iswaiting"<<endl;

       consumer_wait=true;

       pthread_cond_wait(&empty_cond,&mutex);

       consumer_wait=false;

     }

     cout<<"consumer consumes an item"<<front<<":"<<buffer[front]<<endl;

    front=(front+1)%BUFFER_LENGTH;

     --size;

    sleep(2);

     if(size==BUFFER_LENGTH-1){

       while(true){

         if(producer_wait){

            pthread_cond_signal(&full_cond);

            break;

         }

       }

     }

    pthread_mutex_unlock(&mutex);

   }

}

int main(){

  pthread_t produce_id,consumer_id;

  pthread_mutex_init(&mutex,NULL);

  pthread_create(&produce_id,NULL,producer,NULL);

  pthread_create(&consumer_id,NULL,consumer,NULL);

  pthread_join(produce_id,NULL);

  pthread_join(consumer_id,NULL);

   return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值