alsi9 / philosophers

Thread, process, semaphore, mutex in C

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

philosophers (125%)

В данном проекте реализуется задача обедающих философов на языке С.

Основная часть

Каждый философ запускается как поток и контроль общих вилок происходит с использованием мьютексов.

  • Один или несколько философов сидят за круглым столом и делают одно из трех: едят, думают или спят.
  • Во время еды они не думают и не спят, во время сна они не едят и не думают и, конечно же, думая, они не едят и не спят.
  • Философы сидят за круглым столом с большой миской спагетти в центре. На столе столько вилок, сколько и философов.
  • Поскольку спагетти сложно подавать и есть одной вилкой, предполагается, что философ должен есть двумя вилками, по одной на каждую руку.
  • Философы никогда не должны голодать.
  • Каждому философу нужно есть.
  • Философы не разговаривают друг с другом.
  • Философы не знают, когда умирает другой философ.
  • Каждый раз, когда философ заканчивает есть, он роняет вилки и начинает спать.
  • Когда философ уснет, он начнет думать.
  • Симуляция останавливается, когда философ умирает.

Программа принимает следующие аргументы:

Аргумент описание
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

Бонусная часть

Каждый философ запускается в дочернем процессе, контроль за общими вилками совершается с использованием семофоров.

  • Все вилки находятся посередине стола.
  • У них нет состояний в памяти, но количество доступных вилок представлено семафором.
  • Каждый философ должен быть процессом, и главный процесс не должен быть философом.

About

Thread, process, semaphore, mutex in C


Languages

Language:C 90.7%Language:Makefile 9.3%