//----------------------------------------------------------------------------
// Title - Implement producer-consumer algorithm using multi-threading concept
//----------------------------------------------------------------------------
------------------------
MAIN PROGRAM a10.c
------------------------
#define BUFFER_SIZE 10
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#define TRUE 1
pthread_mutex_t mutex; //the mutex lock
sem_t full,empty; //semaphores
int buffer[BUFFER_SIZE];
int counter; //buffer counter
pthread_t tid; //threadid
void *consumer(void *param);
void *producer(void *param); //the producer thread
void insert_item(int);
int remove_item();
void initialize()
{
pthread_mutex_init(&mutex,NULL); //create the mutex lock
sem_init(&full,1,0); //initialize full semaphore to 0
sem_init(&empty,1,BUFFER_SIZE); //initialize empty semaphore to BUFFER_SIZE
counter=0;
}
/*Produce Thread*/
void *producer(void *param)
{
int item;
int waittime;
waittime=rand()%5;
sleep(waittime);
item=rand()%10;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
printf(" Producer produced : %d \\n",item);
insert_item(item);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
/*Consumer thread*/
void *consumer(void *param)
{
int item;
int waittime; //next item is consumed after waittime
waittime=rand()%3;
sleep(waittime);
sem_wait(&full); //wait if the buffer is full
pthread_mutex_lock(&mutex); //acquire the buffer
item=remove_item();
printf(" Consumer consumed : %d \\n ",item);
pthread_mutex_unlock(&mutex); // release the buffer
sem_post(&empty); //signal empty
}
//add item to buffer
void insert_item(int item)
{
buffer[counter++]=item;
}
//remove an item from the buffer
int remove_item()
{
return(buffer[--counter]);
}
int main()
{
int n1;
int n2;
int i;
printf(" Enter No. of Producers : \\n");
scanf("%d",&n1);
printf(" Enter No. of Consumers : \\n");
scanf("%d",&n2);
initialize();
//create producers threads
for(i=0;i<n1;i++)
pthread_create(&tid,NULL,producer,NULL);
//create consumer threads
for(i=0;i<n2;i++)
pthread_create(&tid,NULL,consumer,NULL);
sleep(50);
exit(0);
}
------------------------
END OF THE PROGRAM
------------------------
/*
------------------------
OUTPUT
------------------------
gescoe@gescoe-Vostro-230:~/Desktop$ gcc a10.c -lpthread
gescoe@gescoe-Vostro-230:~/Desktop$ ./a.out
Enter No. of Producers :
3
Enter No. of Consumers:
3
Producer Produced 3
Consumer Consumed 3
Producer Produced 6
Consumer Consumed 6
Producer Produced 9
Consumer Consumed 9
------------------------
EXIT
------------------------
*/