您的位置:首页 > 运维架构 > Linux

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

2017-11-13 10:55 225 查看
条件锁解决问题

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: