I'm tryng to do the Dining philosophers, and in my code, after a thread drop the stick, they also send a broadcast to all thread waiting in the while loop, to move foward, but apparently this is not happening and I don't know way
https://github.com/lucizzz/Philosophers/blob/main/dinning.c
CodePudding user response:
Your code has a lot of bugs, but the most fundamental one is that you access shared state without holding the mutex that protects that state. For example, the while
loop in routine_1
tests the stick
array without holding the mutex. It even calls pthread_cond_wait
without holding the mutex.
This is wrong for many reasons, but the most obvious is this -- what if the while
loop decides to call pthread_cond_wait
, but then before you call pthread_cond_wait
, the thread holding the resources releases it. Now, you are calling pthread_cond_wait
to wait for something that has already happened -- you will be waiting forever.
You must hold the mutex both when you decide whether to call pthread_cond_wait
and when you actually do call pthread_cond_wait
or your code will wait forever if a thread releases the resource before you were able to wait for it.
Fundamentally, the whole point of condition variables is to provide an atomic "unlock and wait" operation to avoid this race condition. But your code doesn't use the mutexes correctly.