Which of the following statements is false? This code runs without data-race or deadlock problems Removing mutex semaphore causes the data-race problem In the producer_fn, swapping sem_post(&slots_filled) and sem_post(&mutex) code lines causes deadlock. Removing slots_filled and slots_empty semaphores causes the data-race problem
Answer the given question with a proper explanation and step-by-step solution.
#define MACHINE_CAPACITY 64
sem_t mutex, slots_filled, slots_empty;
struct machine{ int nitems; };
double _sleep_time() { return 2 * ((double) rand() / (double) RAND_MA
X); }
void *producer_fn(void *args) {
int cokes;
struct machine *cur_machine = (struct machine *) args;
while (1) {
sem_wait(&slots_empty);
sem_wait(&mutex);
cokes = cur_machine->nitems;
cur_machine->nitems += 1;
printf("[Producer] enqueue cokes %d -> %d\n", cokes, cur_machin
e->nitems);
sem_post(&mutex);
sem_post(&slots_filled);
sleep(_sleep_time());
}
}
void *consumer_fn(void *args) {
int cokes;
struct machine *cur_machine = (struct machine *) args;
while (1) {
sem_wait(&slots_filled);
sem_wait(&mutex);
cokes = cur_machine->nitems;
cur_machine->nitems -= 1;
printf("[Consumer] dequeue cokes %d -> %d\n", cokes, cur_machin
e->nitems);
sem_post(&mutex);
sem_post(&slots_empty);
sleep(_sleep_time());
}
}
int main(void) {
struct machine coke_machine = { .nitems = 0 };
srand (time(NULL));
sem_init(&mutex, 0, 1);
sem_init(&slots_empty, 0, MACHINE_CAPACITY);
sem_init(&slots_filled, 0, 0);
pthread_t producer, consumer;
pthread_create(&producer, NULL, producer_fn, (void *)&coke_machin
e);
pthread_create(&consumer, NULL, consumer_fn, (void *)&coke_machin
e);
pthread_join(producer, NULL);
pthread_join(consumer, NULL);
return 0; // code only reaches here if the machine is broken
}
Trending now
This is a popular solution!
Step by step
Solved in 4 steps