В данном проекте реализуется задача обедающих философов на языке С.
- Один или несколько философов сидят за круглым столом и делают одно из трех: едят, думают или спят.
- Во время еды они не думают и не спят, во время сна они не едят и не думают и, конечно же, думая, они не едят и не спят.
- Философы сидят за круглым столом с большой миской спагетти в центре. На столе столько вилок, сколько и философов.
- Поскольку спагетти сложно подавать и есть одной вилкой, предполагается, что философ должен есть двумя вилками, по одной на каждую руку.
- Философы никогда не должны голодать.
- Каждому философу нужно есть.
- Философы не разговаривают друг с другом.
- Философы не знают, когда умирает другой философ.
- Каждый раз, когда философ заканчивает есть, он роняет вилки и начинает спать.
- Когда философ уснет, он начнет думать.
- Симуляция останавливается, когда философ умирает.
Программа принимает следующие аргументы:
Аргумент | описание |
---|---|
number_of_philosophers | это количество философов, а также количество вилок. |
time_to_die (ms) | если философ не начнет есть через "time_to_die" миллисекунды после начала последнего приема пищи или начала симуляции, он умрет. |
time_to_eat (ms) | это время, необходимое философу, чтобы поесть. В течение этого времени им нужно будет блокировать две вилки. |
time_to_sleep (ms) | временя, которое философ проведет во сне |
must_eat_times | необязательный параметр, если все философы съедят хотя бы "must_eat_times" раз, симуляция прекратится. Если не указано иное, симуляция прекратится только после смерти философа. |
- Каждому философу следует дать номер от 1 до «число_философов».
- Философ номер 1 стоит рядом с философом номером «number_of_philosophers». Любой другой философ с числом N находится между философом N - 1 и философом N + 1.
- Любое изменение статуса философа должно быть записано следующим образом (с заменой X номером философа и timestamp_in_ms текущей меткой времени в миллисекундах) timestamp_in_ms X has taken a fork (взял вилку) timestamp_in_ms X is eating (ест) timestamp_in_ms X is sleeping (спит) timestamp_in_ms X is thinking (думает) timestamp_in_ms X died (умирает)
- Напечатанный статус не следует путать или переплетать со статусом другого философа.
- Между смертью философа и моментом, когда он напечатает свою смерть, не может быть больше 10 мс.
- Одна вилка между каждым философом, поэтому, если это несколько философов, будет вилка справа и слева от каждого философа.
- Чтобы философы не дублировали вилки, вы должны защитить состояние вилок мьютексом для каждой из них.
- У каждого философа должна быть поток.
Пример запуска работы с параметрами:
./philosophers 5 800 200 200 2
Для компиляции приложения нужно запустить команду
make all
Каждый философ запускается в дочернем процессе, контроль за общими вилками совершается с использованием семофоров.
- Все вилки находятся посередине стола.
- У них нет состояний в памяти, но количество доступных вилок представлено семафором.
- Каждый философ должен быть процессом, и главный процесс не должен быть философом.