Блок задач

12. Многопоточность

Сложность 6

Задача «Система обслуживания клиентов»

Постановка задачи

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

Вспомогательные классы

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

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

Класс logger потокобезопасный (thread-safety) класс для логирования сообщений в поток (std::ostream). Вся информация (открытие/закрытие стола, появление нового клиента с номером билета, обслуживание клиента за i-ым столом, размер текущей очереди при изменении, завершение обслуживания клиента за i-ым столом) должна логироваться.

Дополнительная информация

Общее количество клиентов CustomerAmount, которые могут посетить офис, задается в конфигурационном файле. Новый клиент заходит в офис, например, каждые 200-500 миллисекунд (т.е. в диапазоне от 200 до 500 мс, диапазон задается в конфигурационном файле), получает билет и ждет своей очереди. При обслуживании клиента тратится, например, от 2000 до 3000 мс (диапазон задается в конфигурационном файле) времени.
Офис перестает принимать клиентов, после того как в него зайдут CustomerAmount клиентов, и переходит в режим закрытия. Столы обслуживания работают до тех пор, пока офис не перейдет в режим закрытия, но не раньше, чем будут обслужены все клиенты, находящиеся в очереди.

Требования

  1. Написать unit test'ы для реализованных классов и функций.
  2. При решении задачи должны применяться паттерны проектирования, полиморфизм, stl алгоритмы.