Текущий архив: 2002.04.18;
Скачать: CL | DM;
Вниз
Задачка ::> Найти похожие ветки
← →
VuDZ (2002-03-12 05:59) [0]Необходимо разработать приложение. <cutted> Внешне оно будет представлять из себя диалог с листбоксом, куда выводятся все сообщения о событиях в нитях (threads), см. о нитях подробнее ниже, и кнопкой "Close". При реализации предпочтительнее использовать Win32 API объекты, предназначенные для синхронизации работы нитей, а не wrapper-ы, предлагаемые библиотекой MFC для них. (Это пожелание. Если проще и удобнее использовать объекты MFC, то их также можно применять.)
Существует 2 типа нитей - "писатели" и "читатели" для одного ресурса. (Логику их работы можно сравнить с редактированием и чтением одного ресурса.) Соответственно, необходимо реализовать 2 функции для этих типов нитей - одну для "писателя" и одну для "читателя". Правила работы этих нитей:
1. Если один "писатель" пишет данные, другой "писатель" не может писать в этот момент.
2. Если один "писатель" пишет данные, другие "читатели" не могут читать данные в этот момент.
3. Если один "читатель"читает данные, никто из "писателей" не может писать данные в этот момент.
4. Если один "читатель" читает данные, то другие "читатели" также могут читать данные в этот момент.
Может быть только три состояния каждой нити - выполняет операцию (чтение или запись), ждет выполнения операции (ресурс занят) и холостой режим (после выполнения операции, нить должна "заснуть" на случайное время.) Время, отводимое на выполнение этих операций случайное для каждой операции и диапазон значений задается при старте программы. Время может изменяться в диапазоне от 2 до 10 секунд.Нужно задать значения по умолчанию: время на запись должно быть больше, чем на чтение; время холостого режима также должно быть меньше у "читателей". Все задержки выполняются командой Sleep. Действительное время задержки должно вычисляться случайно для каждой операции и для каждой нити, исходя из заданного диапазона (т.е. не может быть такого, что время вычисляется только один раз на старте программы и используется одно и то же для всех нитей).
Формат записи строк в листбокс следующий: имя нити (это может быть WR1, WR2, RD1, ..., RD4), имя операции (WRITE, READ, WAIT, SLEEP), текущее значение ресурса для операций записи (значение после изменения) и чтения. Вывод должен быть отформатирован (выровнен) для удобства просмотра результатов работы нитей. Ресурс представляет собой строку из 8 символов, которая случайно меняется нитью-писателем.
После старта приложения в обработчике сообщения WM_INITDIALOG должны запуститься 6 нитей (thread) - два "писателя" и четыре "читателя". Эти нити должны работать до закрытия диалога.В этих нитях (имеются в виду и "читатель" и "писатель") не должно использоваться никаких message loops и они при своей работе не должны загружать процессор на 100%.
При работе этих нитей обязательно должно использоваться одно событие (event) hEventDataReady, которое хранит текущее состояние ресурса. Signaled состояние этого события говорит о том, что ресурс может быть использован для чтения.Нить-читатель не может работать с событием hEventDataReady - не может управлять его состоянием. Это может делать только нить-писатель, указывая нитям-читателям, что ресурс доступен на чтение.
Операция записи имеет больший приоритет над операцией чтения (не путать с приоритетами нитей - приоритеты всех нитей, как писателей, так и читателей должны быть одинаковы). Т.е. при начале выполнения операции записи как раз и используется событие hEventDataReady, чтобы остановить последующие операции чтения от выполнения. Это также решает проблему, когда последовательное выполнение оперций чтения не даст возможности выполнить никогда операцию записи.
Синхронизация и управление работой всех нитей ДОЛЖНО быть реализовано только с использованием объектов Win32 API, специально для этого предназначенных.
Диалог содержит также одну кнопку "Close".По нажатию кнопки "Close" приложение должно корректно закончить работу - т.е. оповестить все потоки об окончании работ и только после ДЕЙСТВИТЕЛЬНОГО окончания всех потоков закончить работу приложения. Окончание работы нити ни в коем случае не может быть выполнено при помощи функии TerminateThread.
Ну-с, кто правильно сделает?
У меня на это ушло в общей сумме 8 часов.
PS только не флеймите, пожалуйста тут, а задавайте или вопросы или предлагайте решения или идеи.
← →
VuDZ (2002-03-12 06:23) [1]http://vudz.by.ru/files/athenaeum.exe - вот пример, как всё должно выглядеть и работать.
PS только не издевайтсь над временем - если From > To то прийдётся ждать несколько лет, прежде чем завершиться операция(-ии) - ломаломеня сделать проверку, хотя в исходниках есть нужная ф-ия...
← →
Алексей Петров (2002-03-12 09:52) [2]Рихтер задачку уже решал и исходники публиковал :)
← →
VuDZ (2002-03-12 16:03) [3]это онечно хорошо, а сделть самому, без подсказок?
Я то то же исходники выложу, но потом
← →
Алексей Петров (2002-03-12 16:16) [4]Рутина. Нужно просто аккуратно все прописать.
Без реальной задачи заниматься времени нет.
← →
VuDZ (2002-03-12 17:02) [5]ну тогда предложи алгоритм :>
3/4 программёров не смогут решить с наскока эту задачу, хотя самое главное записывается в 50 строках кода :>
Страницы: 1 вся ветка
Текущий архив: 2002.04.18;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.005 c