Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];

Вниз

Задачка ::>   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
14-57845
Tpv
2002-03-06 23:12
2002.04.18
Зависание программы.


1-57800
ded_di
2002-04-04 11:18
2002.04.18
хороший richedit


1-57689
Caligula
2002-04-03 21:38
2002.04.18
Работа с файлами


14-57886
lipskiy
2002-03-10 00:54
2002.04.18
Реально ли собрать народ на рисковое мероприятие?


1-57787
Rammst
2002-04-06 06:23
2002.04.18
Клавиатура





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский