| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Синхронизация потоков |
| Автор: Lost_soul 24.12.2007, 10:31 |
| Помогите,пожалуйста, ссделать такое задание: Имеется N1 серверов которые обрабатывают заявки и N2 клиентов, которые производят заявки. Разработать программу, которая моделирует данную систему, при условии, что серверы и клиенты это отдельные потоки. Очередь заявок ограничена N3 элементами. Время, через которое производится заявка – это время из диапазона (Т1-Т2), время обработки заявки – из диапазона (Т3-Т4). заранее спасибо=) у меня была аналогичная задача,только там не шло речи о синхронизации. там была ситуация с кассами в банках, то есть нынешнюю задачу я понимаю так: потоки серверов...это конкретное число серверов(вводится пользователем N1),которые выполняют обработку заявки за время в диапазоне Т3-Т4(вводится). через время между Т1 и Т2(вводятся) появляются новые потоки-клиенты(их кол-во N2),которые подают заявку и она обрабатывается сервером. при этом есть общая очередь клиентов и очередь для каждого сервера(огрниченная количеством N3-вводится). когда закончатся клиенты-можно вывести отчет какой сервер сколько какого клиента обрабатывал....не знаю,на сколько это возможно... очень прошу помочь!хотя бы советом...не могу придумать,как всё это дело организовать=( зы компилятор C++ Builder 6.0 +прикрепляю файл с кодом про кассы. |
| Автор: xvr 24.12.2007, 15:43 | ||
Организовать очень просто: 1) Клиенты и серверы просто потоки 2) Центральная часть системы - очередь запросов. 3) Количество элементов в очереди считается семафором (макс. значение семафора - N3) 4) Добавление и удаление элементов из очереди производится под контролем критической секции. Добавление заявки: 1) Захватывается критическая секция 2) Увеличение семафора на 1 (ReleaseSemaphore), если увеличение невозможно, то освобождение крит. секции, Sleep и все снова. 3) Добавляется заявка в очередь, 4) Освобождается критическая секция Обработка заявки: 1) Ожидание семафора 2) Захват критической секции 3) Извлечение заявки 4) Освобождение критической секции 5) Обработка заявки (Sleep на время из диапазона T3-T4) Все потоки серверов ждут на п1 из обработчика, потоки клиентов весят в Sleep и периодически просыпаясь шлют заявки. Имеет смысл добавить еще один Event для обеспечения корректного выключения всей системы, потоки серверов при этом должны ждать в п1 семафора или этого Event'а, при наступлении последнего они должны завершаться. Главный поток должен создать все синхронизирующие объекты, породить клиентов и серверов, и ждать окончания сессии (как его задаст пользователь), после чего он должен установить спец. переменную, по которой должны завершиться все клиентские потоки, затем установить Event, затем ждеть завершения всех потоков (клиентов и серверов), затем завершиться сам. |