Modify the producer-consumer implementation code bellow, so that it uses monitors to handle race conditions instead of semaphores or mutexes. Use the pthread library implementation #include #include #include #include #define BUFFER_SIZE 20 pthread_mutex_t mutex; int count = 0; int buffer[BUFFER_SIZE]; pthread_t tid; int producers = 0, consumers = 0; void insert(int item) { while (count == BUFFER_SIZE); if (count < BUFFER_SIZE) { buffer[producers] = item; producers++; producers=producers%BUFFER_SIZE; sleep(1); } return; } int remove_item() { int item; while (count == 0); if (count > 0) { item = buffer[consumers]; buffer[consumers] = buffer[consumers - 1]; consumers++; consumers=consumers%BUFFER_SIZE; sleep(1); } return item; } void * producer(void *param) { int item; while (1) { item = rand() % BUFFER_SIZE; while (count >= BUFFER_SIZE); pthread_mutex_lock(&mutex); insert(item); pthread_mutex_unlock(&mutex); count++; printf("in: %d ", producers); printf("inserted: %d\n", item); } } void * consumer(void *param) { int item; while (1) { while (count <= 0); pthread_mutex_lock(&mutex); item = remove_item(); pthread_mutex_unlock(&mutex); count--; printf("out: %d ", consumers); printf("removed: %d\n", item); } } int main(int argc, char *argv[]) { int producers = atoi(argv[1]); int consumers = atoi(argv[2]); int i; for (i = 0; i < producers; i++) pthread_create(&tid, NULL, producer, NULL); for (i = 0; i < consumers; i++) pthread_create(&tid, NULL, consumer, NULL); pthread_join(tid, NULL); }
Modify the producer-consumer implementation code bellow, so that it uses monitors to handle race conditions instead of semaphores or mutexes.
Use the pthread library implementation
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 20
pthread_mutex_t mutex;
int count = 0;
int buffer[BUFFER_SIZE];
pthread_t tid;
int producers = 0, consumers = 0;
void insert(int item)
{
while (count == BUFFER_SIZE);
if (count < BUFFER_SIZE)
{
buffer[producers] = item;
producers++;
producers=producers%BUFFER_SIZE;
sleep(1);
}
return;
}
int remove_item()
{
int item;
while (count == 0);
if (count > 0)
{
item = buffer[consumers];
buffer[consumers] = buffer[consumers - 1];
consumers++;
consumers=consumers%BUFFER_SIZE;
sleep(1);
}
return item;
}
void *
producer(void *param)
{
int item;
while (1)
{
item = rand() % BUFFER_SIZE;
while (count >= BUFFER_SIZE);
pthread_mutex_lock(&mutex);
insert(item);
pthread_mutex_unlock(&mutex);
count++;
printf("in: %d ", producers);
printf("inserted: %d\n", item);
}
}
void *
consumer(void *param)
{
int item;
while (1)
{
while (count <= 0);
pthread_mutex_lock(&mutex);
item = remove_item();
pthread_mutex_unlock(&mutex);
count--;
printf("out: %d ", consumers);
printf("removed: %d\n", item);
}
}
int main(int argc, char *argv[])
{
int producers = atoi(argv[1]);
int consumers = atoi(argv[2]);
int i;
for (i = 0; i < producers; i++)
pthread_create(&tid, NULL, producer, NULL);
for (i = 0; i < consumers; i++)
pthread_create(&tid, NULL, consumer, NULL);
pthread_join(tid, NULL);
}
Step by step
Solved in 2 steps with 5 images