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