生产者-消费者”问题 用C语言编写

Python017

生产者-消费者”问题 用C语言编写,第1张

#include<stdio.h>  

#include<stdlib.h>  

#include<unistd.h>  

#include<semaphore.h>  

#include<pthread.h>  

  

#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=0i<20i++)  

   {  

      printf("___")  

   }  

   printf("\n")  

   for(i=0i<20i++)  

      printf("|%d|",buffer[i])  

   printf("\n")  

   for(i=0i<20i++)  

   {  

      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[0134mConsumer %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=0i<PRODUCERi++)//创建生产者线程  

   {  

      rthread[i]=pthread_create(&producer[i], NULL, Producer, NULL)  

      if(rthread[i])  

      {  

          printf("producer %d create failed /n", i)  

          exit(1)  

      }  

   }  

   for(i=0i<CONSUMERi++)//创建消费者线程  

   {  

      rthread[i]=pthread_create(&consumer[i], NULL, Consumer,NULL)  

      if(rthread[i])  

      {  

          printf("consumer %d create failed /n", i)  

          exit(1)  

      }  

   }  

   for(i=0i<PRODUCERi++)//销毁生产者线程  

   {  

      pthread_join(producer[i],NULL)  

   }  

   for(i=0i<CONSUMERi++)//销毁生产者线程  

   {  

      pthread_join(consumer[i],NULL)  

   }  

   exit(0)  

}

稍微修改了一点,好像没什么大问题。

#include <stdio.h>

#include <windows.h>

#define n 10 //缓冲区容量大小

typedef int semaphore//信号量

int in = 0, out = 0

semaphore mutex = 1, empty = n, full = 0, buffer[n], front = 0, rear = 0

void proceducer()

void consumer()

void wait(semaphore&pass) {// P操作

pass--

}

void signal(semaphore&release) {// V操作

release++

}

void produce_item(char* item_ptr) {//生产者生产 并标记为T True 代表该处已满

*item_ptr = 'T'

}

void put_buffer(int pass) {//生产者将物品放入缓冲区

buffer[front] = pass

printf("produce is %c into buffer[%d]\n", buffer[front], front)

front = (front + 1) % n

}

void remove_buffer(char* release) {//消费者消费缓冲区,并标记为F false 代表该处已空

printf("consumer use is %c from buffer[%d]\n", buffer[rear], rear)

*release = buffer[rear]

buffer[rear] = 'F'

printf("now the buffer[%d] is %c !\n", rear, buffer[rear])

rear = (rear + 1) % n

}

void consume_item() {

printf("consumer had use the product\n\n")

}

void proceducer() {

char item

while (1) {

Sleep(1000)

produce_item(&item)

wait(empty)

wait(mutex)

put_buffer(item)

signal(mutex)

signal(full)

if (full == n)

consumer()

}

}

void consumer() {

char get_item

while (1) {

Sleep(1000)

wait(full)

wait(mutex)

remove_buffer(&get_item)

signal(mutex)

signal(empty)

consume_item()

if (empty == n)

proceducer()

}

}

int main()

{

proceducer()

return 0

}