#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h> // replace this with #include<windows.h> for windows platform
#define BUFFER_SIZE 99
#define PRODUCTION_COST 0
char producer_array[BUFFER_SIZE * 10];
char consumer_array[BUFFER_SIZE];
int producer_index = 0;
int consumer_index = 0;
pthread_mutex_t producer_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t consumer_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t producer_cond = PTHREAD_COND_INITIALIZER;
pthread_cond_t consumer_cond = PTHREAD_COND_INITIALIZER;
void *producer1(void *arg) {
while (1) {
char product;
int rand_int = rand() % 3; // Change to 3 for three types of products
if (rand_int == 0) {
product = 'B';
sleep(PRODUCTION_COST);
} else if (rand_int == 1) {
product = 'R';
sleep(PRODUCTION_COST);
} else {
product = 'G';
sleep(PRODUCTION_COST);
}
pthread_mutex_lock(&producer_mutex);
if (producer_index >= BUFFER_SIZE * 10) {
pthread_mutex_unlock(&producer_mutex);
break;
}
producer_array[producer_index++] = product;
pthread_cond_signal(&producer_cond);
pthread_mutex_unlock(&producer_mutex);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
while (1) {
pthread_mutex_lock(&consumer_mutex);
if (consumer_index >= BUFFER_SIZE) {
pthread_mutex_unlock(&consumer_mutex);
break;
}
pthread_mutex_lock(&producer_mutex);
while (producer_index <= 0) {
pthread_cond_wait(&producer_cond, &producer_mutex);
}
char last_p_char = producer_array[producer_index - 1];
char last_c_char = (consumer_index > 0) ? consumer_array[consumer_index - 1] : '\0';
if ((last_c_char == 'G' && last_p_char == 'B') ||
(last_c_char == 'B' && last_p_char == 'R') ||
(last_c_char == 'R' && last_p_char == 'G') ||
(last_c_char == '\0' && last_p_char == 'B')) { // Change to 'B' for the sequence to be BRG
consumer_array[consumer_index++] = last_p_char;
producer_index--;
}
pthread_cond_signal(&consumer_cond);
pthread_mutex_unlock(&producer_mutex);
pthread_mutex_unlock(&consumer_mutex);
}
pthread_exit(NULL);
}
int main() {
pthread_t producer_thread;
pthread_t consumer_thread;
pthread_create(&producer_thread, NULL, producer1, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
printf("Consumer Array: ");
for (int i = 0; i < consumer_index-1; i++) {
printf("%c", consumer_array[i]);
}
printf("\n");
printf("Producer Array: ");
for (int i = 0; i < producer_index-1; i++) {
printf("%c", producer_array[i]);
}
printf("\n");
return 0;
}