Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(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
+прикрепляю файл с кодом про кассы.

Организовать очень просто:
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, затем ждеть завершения всех потоков (клиентов и серверов), затем завершиться сам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)