Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Синхронизация потоков(winapi)

Автор: Tribunal 24.12.2007 14:33

Помогите,пожалуйста, ссделать такое задание:

Имеется N1 серверов которые обрабатывают заявки и N2 клиентов, которые производят заявки.
Разработать программу, которая моделирует данную систему, при условии, что серверы и клиенты это отдельные потоки.
Очередь заявок ограничена N3 элементами. Время, через которое производится заявка – это время из диапазона (Т1-Т2), время обработки заявки – из диапазона (Т3-Т4).

заранее спасибо=)

у меня была аналогичная задача,только там не шло речи о синхронизации.
там была ситуация с кассами в банках, то есть нынешнюю задачу я понимаю так:
потоки серверов...это конкретное число серверов(вводится пользователем N1),которые выполняют обработку заявки за время в диапазоне Т3-Т4(вводится).
через время между Т1 и Т2(вводятся) появляются новые потоки-клиенты(их кол-во N2),которые подают заявку и она обрабатывается сервером.
при этом есть общая очередь клиентов и очередь для каждого сервера(огрниченная количеством N3-вводится).
когда закончатся клиенты-можно вывести отчет какой сервер сколько какого клиента обрабатывал....не знаю,на сколько это возможно...

очень прошу помочь!хотя бы советом...не могу придумать,как всё это дело организовать=(

зы
компилятор C++ Builder 6.0
+прикрепляю файл с кодом про кассы.


Прикрепленные файлы
Прикрепленный файл  BANK.rar ( 3.54 килобайт ) Кол-во скачиваний: 209

Автор: volvo 24.12.2007 15:23

Tribunal, у тебя же уже есть логика работы программы.

Что касается потоков: создаешь несколько потоков - "серверов", общую очередь "клиентов" (можешь пользоваться либо тем классом TQueue, который есть в приведенной тобой программе, либо стандартным std::queue), заполняешь ее несколькими "клиентами" сразу же. Через промежутки времени между T1 и T2 добавляешь в очередь очередного "клиента". Поток-"сервер" должен периодически (когда в его собственной очереди меньше, чем N3 "клиентов") опрашивать наличие "клиентов" в общей очереди, если она не пуста - то "изымать" очередного клиента из общей очереди (здесь не забываем о том, что обращаться к общим данным надо с использованием критических секций, см. EnterCriticalSection/LeaveCriticalSection) и помещать его в свой буфер, а по окончании обработки заявки предыдущего "клиента" - "изымать" нового клиента уже из своей очереди и обрабатывать его заявку в течении времени от T3 до T4. Здесь уже нет необходимости работать с критическими секциями, поскольку к собственной очереди "сервера" никто другой доступа не имеет... Статистику можно накапливать здесь же, у "сервера", подсчитывая число и время обслуживания клиентов.

Как только очередь "клиентов" пуста - можно удалять потоки-"серверы", для которых закончилась собственная очередь... Перед удалением "сервера" его можно заставить передать всю статистику, например, в Memo основной формы, опять же не забывая о синхронизации - чтобы не было попыток одновременной записи из разных потоков...

Автор: Tribunal 24.12.2007 18:21

не получается=(
просто технически не получается...=(
по идее клиенты-тоже потоки...нужно создавать очередь потоков? о_О
значит когда клиенты переходят из общей очереди в очередь сервера, тоже нужно использовать EnterCriticalSection/LeaveCriticalSection ...
помогите,пожалуйста, ещё... хотя бы какой-то набросок...
ссображаю плохо че-то=( помогите...мне просто эта программа уже срочно нужна...

Автор: volvo 24.12.2007 18:34

Цитата
по идее клиенты-тоже потоки...
А вот это - непонятно... Зачем клиенту быть потоком, а не просто классом/записью (я не сказал, что не получится реализовать с потоками, я просто идею саму не понимаю).

Автор: Tribunal 24.12.2007 19:34

я тоже не понимаю=(
так что?подбросите ещё подсказок? rolleyes.gif