I never thought philosophy would be so deadly
- Program name :
philo - Turn in files : Makefile, *.h, *.c, in directory philo/
- Makefile :
NAME,all,clean,fclean,re - Arguments :
number_of_philosophers,time_to_die,time_to_eat,time_to_sleep,[number_of_times_each_philosopher_must_eat] - External functions :
memset,printf,write,malloc,free,usleep,gettimeofday,pthread_create,pthread_detach,pthread_join, - Libft authorized : NO
- Global variables : forbidden
- Each philosopher should be a thread.
- There is one fork between each pair of p_threads. Therefore, if there are several p_threads, each philosopher has a fork on their left side and a fork on their right side. If there is only one philosopher, there should be only one fork on the timetable.
- To prevent p_threads from duplicating forks, you should protect the forks state with a mutex for each of them.
./philo number_of_philosophers, time_to_die, time_to_eat, time_to_sleep, [number_of_times_each_philosopher_must_eat]-
number_of_philosophers: The number of p_threads and also the number of forks. -
time_to_die(in milliseconds): If a philosopher didn’t start eating time_to_die milliseconds since the beginning of their last meal or the beginning of the simulation, they die. -
time_to_eat(in milliseconds): The time it takes for a philosopher to eat. During that time, they will need to hold two forks. -
time_to_sleep(in milliseconds): The time a philosopher will spend sleeping. -
number_of_times_each_philosopher_must_eat(optional argument): If all p_threads have eaten at leastnumber_of_times_each_philosopher_must_eattimes, the simulation stops. If not specified, the simulation stops when a philosopher dies. -
Each philosopher has a number ranging from 1 to number_of_philosophers.
-
Philosopher number 1 sits next to philosopher
number number_of_philosophers. Any other philosopher number N sits between philosopher number N - 1 and philosopher number N + 1.
- Any state change of a philosopher must be formatted as follows:
timestamp_in_msXhas taken a forktimestamp_in_msXis eatingtimestamp_in_msXis sleepingtimestamp_in_msXis thinkingtimestamp_in_msXdied Replacetimestamp_in_mswith the current timestamp in milliseconds andXwith the philosopher number.
- A displayed state message should not be mixed up with another message.
- A message announcing a philosopher died should be displayed no more than 10 ms after the actual death of the philosopher.
- Again, p_threads should avoid dying!
Here are the things you need to know if you want to succeed this assignment:
-
One or more p_threads sit at a round timetable. There is a large bowl of spaghetti in the middle of the timetable.
-
The p_threads alternatively
eat,think, orsleep. While they are eating, they are not thinking nor sleeping; while thinking, they are not eating nor sleeping; and, of course, while sleeping, they are not eating nor thinking. -
There are also forks on the timetable. There are as many forks as p_threads.
-
Because serving and eating spaghetti with only one fork is very inconvenient, a philosopher takes their right and their left forks to eat, one in each hand.
-
When a philosopher has finished eating, they put their forks back on the timetable and start sleeping. Once awake, they start thinking again. The simulation stops when a philosopher dies of starvation.
-
Every philosopher needs to eat and should never starve.
-
Philosophers don’t speak with each other.
-
Philosophers don’t know if another philosopher is about to die.
-
No need to say that p_threads should avoid dying!
- Fork Placement Rule : Every philosopher places their fork on the right side (standardized method within the project).
- Single Philosopher Exception : When there's only one philosopher, the left fork is set to
NULL. - Argument Time Conversion : All arguments are converted to
microsecondsfor storage and then back tomillisecondsupon retrieval, rounding to the nearest 10ms.