Проект реализует знаменитую задачу о философах, используя posix threads для имитации жизнедеятельности каждого философа и механизм мьютексов для взаимодействия между ними. В папке philo_bonus представлена реализация той же задачи с использованием процессов, для взаимодействия между которыми используются семафоры.
Один или несколько философов сидят за круглым столом. В центре стола стоит большая миска со спагетти. На столе по левую и правую руку от каждого философа лежат вилки. Вилок столько же, сколько философов.
Поскольку есть спагетти только одной вилкой очень неудобно, каждый философ берёт для еды правую и левую вилки, по одной в каждой руке. Поэтому все философы не могут есть одновременно.
Когда философ заканчивает есть, он кладет вилки обратно на стол и ложится спать. Проснувшись, он начинает думать. Затем, получив вилки, необходимые для еды, он снова начинает есть.
Симуляция прекращается, когда какой-нибудь философ умирает от голода, не получив вилку до истечения времени time_to_die.
Философы не разговаривают друг с другом. Философы не знают о состоянии друг друга.
В консоль выводится журнал, который информирует, когда философ предпринял одно из следующих действий:
- взял вилку;
- начал есть;
- начал думать;
- начал спать;
- умер.
Каждое действие имеет временную метку в миллисекундах.
Основной целью этой программы было оптимизировать ее таким образом, чтобы накапливалось как можно меньше задержек, так что даже для большого количества потоков / процессов, если параметры гарантируют, что симуляция выполняется бесконечно (например, time_to_eat + time_to_sleep меньше, чем time_to_die), программа выполняется как можно дольше и время её выполнения зависит только от производительности компьютера. Также ключевым моментом является управление ресурсами разделяемой памяти и предотвращение гонки между потоками.
Программе при запуске необходимо предоставить следующие параметры:
number_of_philosophers - количество философов
time_to_die - время, которое философ может прожить от одного приёма пищи до другого
time_to_eat - время, которое философ тратит на еду
time_to_sleep - время, которое философ тратит на сон
number_of_times_each_philosopher_must_eat - количество приёмов пищи каждого философа, которое необходимо для успешного завершения программы
Последний параметр опционален, если его не предоставит пользователь, симуляция будет длиться до смерти одного из философов.
$ cd philo
$ make
$ ./philo number_of_philosophers time_to_die time_to_eat time_to_sleep [number_of_times_each_philosopher_must_eat]
$ cd philo_bonus
$ make
$ ./philo_bonus number_of_philosophers time_to_die time_to_eat time_to_sleep [number_of_times_each_philosopher_must_eat]