Advertisement
This is comment for paste
fifth_task
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Уфф, ну поехали!
- Общее описание работы:
- На старте вводятся количество столов и мест за столом (N и M)
- Затем время уборки за каждым человеком
- Далее создаются 2 потока для продавцов и один для уборщика (их описание будет позже)
- Теперь пользователю доступна менюшка для управления всем этим добром.
- Можно добавить гостя, после ввода его параметров он добавится в очередь
- и будет обработан первым освободившимся продавцом.
- Затем гость выбирает еду на протяжении checkoutTime секунд (в это время продавец ждёт, пока гость не выберет).
- После того как гость выбрал, он садится за первый свободный стол, продавец освобождается и может принимать следующего.
- Когда гость доедает, его стол добавляется в очередь чистки, и уборщик, если он свободен, начинает его убирать
- (уборщик закончит уборку через cleanTime после начала). После уборки стол освобождается и начинает принимать новых гостей.
- Описание работы продавца:
- Поток останавливается, пока количество людей в очереди (значение семафора queueSem) не станет >0.
- Как только это происходит, продавец лочит очередь для безопасного чтения и пытается достать оттуда гостя.
- Затем продавец открывает очередь и ждёт checkoutTime секунд, пока гость не выберет заказ.
- После этого садит его за ближайший свободный стол, предварительно заблокировав tableMutex для безопасной записи.
- Далее логика поедания переходит пользователю.
- Описание работы гостя:
- Гость ест на протяжении eatTime секунд, затем лочит cleanTablesMutex для добавления стола в очередь для уборки.
- Затем увеличивает cleanTablesSem, чтобы освободить работу потока уборщика.
- Описание работы уборщика:
- Уборщик ждёт, пока количество столов для уборки (значение семафора cleanTablesSem) не станет >0.
- Затем получает первый в очереди грязный стол, предварительно залочив мьютекс работы с грязными столами,
- и начинает его убирать на протяжении cleanTime секунд.
- После этого отмечает стол как свободный и ждёт следующего стола для уборки.
- Общие приколы:
- Зачем используются мьютексы в связке с семафорами у Уборщика и Продавцов? Эту же работу можно было выполнить,
- используя только мьютексы, проверяя, например, каждую секунду, есть ли в очереди (людей или столов для уборки)
- элементы, однако это тормозило бы работу, так как приходилось бы выделять время на работу потоков продавца и уборщика впустую.
- В то же время при использовании семафоров совместно с мьютексами появляется возможность "усыпить" потоки до того момента,
- как в очереди появится хотя бы один элемент, не проверяя каждые n секунд, есть ли свободный элемент.
- Использовать только семафоры так же не представлялось возможным, т.к. при таком варианте появляется возможность того,
- что 2 потока возьмут в работу одного и того же пользователя.
- Ещё используется блокировка чтения/записи при записи текста в консоль. Это необходимо, поскольку все потоки могут туда писать,
- и запись может перемешиваться.
- В основном потоке, а также потоках продавцов и уборщика используется атомарная переменная stop_thread.
- Для справки: атомарная переменная обеспечивает безопасные чтение и запись в неё без использования мьютексов и прочего.
- Она здесь для того, чтобы по завершению потока main завершались и дочерние потоки, закончив все свои дела.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement