Advertisement
artmexbet
May 11th, 2024
23
0
Never
This is comment for paste fifth_task
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Уфф, ну поехали!
  2.  
  3. Общее описание работы:
  4. На старте вводятся количество столов и мест за столом (N и M)
  5. Затем время уборки за каждым человеком
  6. Далее создаются 2 потока для продавцов и один для уборщика (их описание будет позже)
  7. Теперь пользователю доступна менюшка для управления всем этим добром.
  8. Можно добавить гостя, после ввода его параметров он добавится в очередь
  9. и будет обработан первым освободившимся продавцом.
  10. Затем гость выбирает еду на протяжении checkoutTime секунд (в это время продавец ждёт, пока гость не выберет).
  11. После того как гость выбрал, он садится за первый свободный стол, продавец освобождается и может принимать следующего.
  12. Когда гость доедает, его стол добавляется в очередь чистки, и уборщик, если он свободен, начинает его убирать
  13. (уборщик закончит уборку через cleanTime после начала). После уборки стол освобождается и начинает принимать новых гостей.
  14.  
  15. Описание работы продавца:
  16. Поток останавливается, пока количество людей в очереди (значение семафора queueSem) не станет >0.
  17. Как только это происходит, продавец лочит очередь для безопасного чтения и пытается достать оттуда гостя.
  18. Затем продавец открывает очередь и ждёт checkoutTime секунд, пока гость не выберет заказ.
  19. После этого садит его за ближайший свободный стол, предварительно заблокировав tableMutex для безопасной записи.
  20. Далее логика поедания переходит пользователю.
  21.  
  22. Описание работы гостя:
  23. Гость ест на протяжении eatTime секунд, затем лочит cleanTablesMutex для добавления стола в очередь для уборки.
  24. Затем увеличивает cleanTablesSem, чтобы освободить работу потока уборщика.
  25.  
  26. Описание работы уборщика:
  27. Уборщик ждёт, пока количество столов для уборки (значение семафора cleanTablesSem) не станет >0.
  28. Затем получает первый в очереди грязный стол, предварительно залочив мьютекс работы с грязными столами,
  29. и начинает его убирать на протяжении cleanTime секунд.
  30. После этого отмечает стол как свободный и ждёт следующего стола для уборки.
  31.  
  32. Общие приколы:
  33. Зачем используются мьютексы в связке с семафорами у Уборщика и Продавцов? Эту же работу можно было выполнить,
  34. используя только мьютексы, проверяя, например, каждую секунду, есть ли в очереди (людей или столов для уборки)
  35. элементы, однако это тормозило бы работу, так как приходилось бы выделять время на работу потоков продавца и уборщика впустую.
  36. В то же время при использовании семафоров совместно с мьютексами появляется возможность "усыпить" потоки до того момента,
  37. как в очереди появится хотя бы один элемент, не проверяя каждые n секунд, есть ли свободный элемент.
  38. Использовать только семафоры так же не представлялось возможным, т.к. при таком варианте появляется возможность того,
  39. что 2 потока возьмут в работу одного и того же пользователя.
  40.  
  41. Ещё используется блокировка чтения/записи при записи текста в консоль. Это необходимо, поскольку все потоки могут туда писать,
  42. и запись может перемешиваться.
  43.  
  44. В основном потоке, а также потоках продавцов и уборщика используется атомарная переменная stop_thread.
  45. Для справки: атомарная переменная обеспечивает безопасные чтение и запись в неё без использования мьютексов и прочего.
  46. Она здесь для того, чтобы по завершению потока main завершались и дочерние потоки, закончив все свои дела.
  47.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement