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;
}
#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;
}
相关文章推荐
- Linux C/C++多线程学习:生产者消费者问题
- Linux下生产者与消费者问题
- 生产者-消费者问题实现 (linux下C语言)
- LinuxC/C++编程基础(8) 基于条件变量实现生产者与消费者的实例
- Linux C 实现生产者消费者问题
- Linux下生产者消费者问题详细分析(操作系统期中考试论文---并发程序的同步和互斥)
- Linux生产者消费者问题编程实例
- Linux生产者与消费者的问题实现
- linux下c++实现简单的生产者消费者队列模式
- linux 多线程生产者和消费者问题
- linux中的线程同步:生产者、消费者问题
- 生产者-消费者问题实现 (linux下C语言)
- 生产者-消费者问题实现 (linux下C语言)
- 【读书笔记】linux系统用semaphore来解决经典的生产者-消费者问题
- 【转】linux C 解决 生产者消费者问题
- boost c++ lib on linux(4) - thread同步条件变量学习——生产者消费者队列
- 生产者-消费者问题实现 (linux下C语言)----笛风读书笔记系列
- 生产者-消费者问题实现 (linux下C语言)
- 经典同步问题linux下的C实现:生产者-消费者问题,读者-写者问题,哲学家问题
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)