生产者消费者问题---C语言实现

生产者消费者问题(Producer-consumer problem 是一个多线程同步问题的经典案例。

        生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

下面是一个m生产者n消费者k缓冲区的问题实现

在ubuntu12.10下编译通过

#include
#include
#include
#include
#include

#define PRODUCER 10//生产者数量
#define CONSUMER 8//消费者数量
#define BUFFER 20//缓冲区数量

sem_t empty,full;//同步信号量
pthread_mutex_t mutex;//互斥信号量
int buffer[BUFFER]; //缓冲区

int producer_id=0,consumer_id=0;//生产者消费者ID
int index_in=0,index_out=0;//生产者 消费者 存放 消费的位置

void print()//输出缓冲区
{
   int i;
   printf("Buffer:\n");
   for(i=0;i<20;i++)
   {
      printf("___");
   }
   printf("\n");
   for(i=0;i<20;i++)
      printf("|%d|",buffer[i]);
   printf("\n");
   for(i=0;i<20;i++)
   {
      printf("———");
   } 
   printf("\n");
}
void *Producer()//生产者函数
{
   int ID=++producer_id;

   while(1)
   {
     sleep(3);
     sem_wait(&empty);
     pthread_mutex_lock(&mutex);
     index_in=index_in%BUFFER;

     printf("Producer %d in %d.\n",ID,index_in);
     buffer[index_in]=1;//缓冲区置0
     print();//输出缓冲区情况
     index_in++;
     pthread_mutex_unlock(&mutex);
     sem_post(&full);
   }
}
void *Consumer()//消费者函数
{
   int ID=++consumer_id;

   while(1)
   {
     sleep(3);
     sem_wait(&full);
     pthread_mutex_lock(&mutex);
     index_out=index_out%BUFFER;

     printf("\033[01;34mConsumer %d in %d\033[0m\n",ID,index_out);
     buffer[index_out]=0;//缓冲区置0
     print();//输出缓冲区情况
     index_out++;
     pthread_mutex_unlock(&mutex);
     sem_post(&empty);
   }
}

int main()
{
   //freopen("text.txt","w",stdout);
   int rthread[18],i;
   pthread_t producer[PRODUCER];//生产者
   pthread_t consumer[CONSUMER];//消费者

   int sinit1=sem_init(&empty,0,BUFFER);//初始化同步信号量
   int sinit2=sem_init(&full,0,0);
   int minit =pthread_mutex_init(&mutex,NULL);//初始化互斥信号量
   if(sinit1 && sinit2)
   {
     printf("sem initialize failed /n");
     exit(1);
   }
   if(minit)
   {
     printf("sem initialize failed /n");
     exit(1);
   }
   for(i=0;i

运行结果


…………

你可能感兴趣的:(知识点学习)