Задача на семафоры Unix

Задача на семафоры Unix

05.12.2017 05:57:22 Просмотров 30 Источник

Рассмотрим мост через реку с односторонним движением. Как только перед мостом скапливаются 2 корабля, мост разводится. Необходимо реализовать движение автомобилей/кораблей согласно условиям, используя семафоры и передавая параметры через файл.

Формально я понимаю, что в рамках этой задачи необходимо создать процессы - автомобиль и корабль. Сделать их синхронизацию через семафоры, которые реализованы в Unix в библиотеке . Однако мне прежде не доводилось работать в этой сфере, поэтому нужна сторонняя помощь.

Конкретно, интересно решение задачи, ее методы. Быть может, кто-то сможет поделиться решением аналогичной задачи или конструктивными набросками решения этой, по возможности с кодом.

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/754207/%d0%97%d0%b0%d0%b4%d0%b0%d1%87%d0%b0-%d0%bd%d0%b0-%d1%81%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-unix#comment1163938_754207
Что уже у вас получилось? Добавте ваш код.
https://ru.stackoverflow.com/questions/754207/%d0%97%d0%b0%d0%b4%d0%b0%d1%87%d0%b0-%d0%bd%d0%b0-%d1%81%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-unix#comment1163955_754207
вопрос и заключается в методах, которые можно здесь применить добавлять мне нечего

Ответы - Задача на семафоры Unix / Задача на семафоры Unix

Является ответом!
Sergey

06.12.2017 05:54:47

Предварительно хотел бы заметить, что если Вы попытаетесь реализовать задачу через pthread (man 7 pthreads) и мьютексы/семафоры - головная боль Вам обеспечена. Гораздо проще воспользоваться механизмами синхронизации, уже имеющимися в ОС linux:

  1. Каналы (man 7 pipe)
  2. Очереди сообщений (man 7 mq_overview)

Реализация задачи, по моему мнению, проще всего выглядит так:

  1. Создаём три процесса - корабли, автомобили, диспетчер;
  2. Процессы "корабли" и "автомобили" отправляют (со случайными интервалами) сообщения диспетчеру;
  3. Диспетчер принимает сообщения и считает их.

Если сообщение пришло от того, кто имеет право проезда, счётчик не увеличивается.

При наступлении указанного условия диспетчер переключает состояние моста и сбрасывает соответствующий счетчик.

Собственно - всё...Очень просто! Именно благодаря тому, что НЕ используются примитивные механизмы синхронизации типа семафоров.

За подробностями рекомендую: Уильям Стивенс; "Unix. Взаимодействие процессов", главы 4, 5 и 6.

Если строго придерживаться постановки задачи, то реализация (в самом общем виде) может выглядеть как-то так:

  1. Главная программа создаёт семафор с помощью sem_open(.. O_CREAT ..);
  2. Главная программа запускает две нити: корабли и диспетчер;
  3. Нить диспетчера повисает на семафоре sem_wait();
  4. Нить кораблей выполняет бесконечный цикл: ждёт случайный промежуток времени и поднимает семафор sem_post();
  5. Сосокочив с семафора, нить диспетчера наращивает счётчик кораблей. Если счётчик == 2, то диспетчер переключает мост и сбрасывает счётчик.

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

Это всё я говорил про POSIX семафоры. Можно сделать то же самое с помощью семафоров System-V. Там всё позаковырестей, но - интересней :-)

Последнее замечание. Начиная с POSIX 2001 в стандарте присутствует возможность, чрезвычайно подходящая для Вашей задачи - условные переменные pthread_cond_init(). Если любопытно - посмотрите!

https://ru.stackoverflow.com/questions/754207/%d0%97%d0%b0%d0%b4%d0%b0%d1%87%d0%b0-%d0%bd%d0%b0-%d1%81%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-unix/754431#comment1164547_754431
Я согласен с Вами, но задача поставлена именно так, требуется синхронизация через семафоры.
https://ru.stackoverflow.com/questions/754207/%d0%97%d0%b0%d0%b4%d0%b0%d1%87%d0%b0-%d0%bd%d0%b0-%d1%81%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-unix/754431#comment1164607_754431
задача поставлена именно так - дописал ответ.
Закрыть X