生产者和消费者问题

一个不错的例子,练手用



这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

#include <pthread.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h> 
#define bool int
#define false 0
#define true 1
#define BUFFER_LENGTH 100

pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_empty = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_full = PTHREAD_COND_INITIALIZER;

bool producer_wait = false;
bool consumer_wait = false;

int size = 0;
int buffer[BUFFER_LENGTH];
int front=0,rear=-1;

void *producer(void *arg)
{
	while(true)
	{
		pthread_mutex_lock(&mylock);
		if(size == BUFFER_LENGTH)
		{
			printf("buffer is full \n");
			producer_wait =true;
			pthread_cond_wait(&cond_full,&mylock);
			producer_wait = false;
		}

		rear = (rear+1)%BUFFER_LENGTH;
		buffer[rear] = rand()%BUFFER_LENGTH;
		printf("producer product the item %d:%d\n",rear,buffer[rear]);
		++ size;

		if(size == 1)
		{
			while(true)
			{
				if(consumer_wait)
				{
					pthread_cond_signal(&cond_empty);
					break;
				}
			}
		}	

		pthread_mutex_unlock(&mylock);
	}
}

void *consumer(void *arg)
{
	while(true)
	{
		pthread_mutex_lock(&mylock);
		if(size == 0)
		{
			printf("buffer is empty\n");
			consumer_wait = true;
			pthread_cond_wait(&cond_empty,&mylock);
			consumer_wait = false;
		}

		printf("consumer consumes an item %d:%d \n",front,buffer[front]);
		front = (front + 1)%BUFFER_LENGTH;
		-- size;
		if(size == BUFFER_LENGTH-1)
		{
			while(true)
			{
				if(producer_wait)
				{
					pthread_cond_signal(&cond_full);
					break;

				}
			}
		}

		pthread_mutex_unlock(&mylock);
	}
}



int main()
{
	pthread_t producer_id;
	pthread_t consumer_id;

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

	sleep(1);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值