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