Answer:
// Producer Thread 
void *producer(void *param) { 
buffer_item item; 
while (true) { 
item = rand() % 100; 
sem_wait(&empty); 
pthread_mutex_lock(&mutex); 
if (insert_item(item)) 
printf("Can't insert item\\"); 
else 
printf("Producer %d: produced %d\\", *((int*)param), item); 
pthread_mutex_unlock(&mutex); 
sem_post(&full); 
} 
} 
 
// Consumer Thread 
void *consumer(void *param) { 
while (true) { 
buffer_item item = NULL; 
if (in > 0) 
item = buffer[in - 1]; 
sem_wait(&full); 
pthread_mutex_lock(&mutex); 
if (remove_item(&item)) 
printf("Can't remove item\\"); 
else 
printf("Consumer %d: consumed %d\\", *((int*)param), item); 
pthread_mutex_unlock(&mutex); 
sem_post(&empty); 
} 
}
Step-by-step explanation:
An outline of the producer and consumer threads appears as shown above.