|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
Семафоры26.05.2019, 11:21. Показов 6132. Ответов 22
Метки нет (Все метки)
Здравствуйте
Задача: разработать комплекс программ, который демонстрирует решения по-дачи «читатели-писатели». В комплекс должны входить: программа-монитор, программа-писатель, программа-читатель. В программе мониторе можно запускать на выполнение и завершать любое количество программ-писателей и программ-читателей, отслеживать и выводить в графическом виде состояние общего для всех программ буфера 31 (Содержание буфера, состояние блокировки Состав групп читателей и писателей; очереди процессов, ожидающих регистрацию в группах), выводить информацию, которую зап-суют писатели и считывают читатели. Программа-писатель и программа-читатель могут быть запущены на вы-полнение в нескольких экземплярах одновременно, но не более 6 вместе (читатели + писатели в любом соотношении, ограничения организовать с помо-щью объекта ядра операционной системы - Job). В буфере сохраняется тексто-е данные, объем буфера - от 10 до 20 символов. Операции чтения и записи оформить таким образом, чтобы их выполнение занимало от 3 до 10 секунд каждая (время определяется случайным образом). Бу-фер разместить в общей для всех процессов памяти с помощью файла, что отражено в память. Синхронизация с помощью семафор(преимущество у писателей тоесть когда пишет писатель в этот момент никто из читателей не может читать ) Не пойму как даже близко реализовать подскажите пожалуйста кто может
0
|
|
| 26.05.2019, 11:21 | |
|
Ответы с готовыми решениями:
22
Win32 и Семафоры Критическая секция и семафоры Синхронизация, используя мьютексы и семафоры |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 26.05.2019, 12:09 | ||
|
Для читателей-писателей нужно использовать shared_mutex. Вообще, основная проблема - кто будет удалять сообщения из очереди. И, насколько я понимаю, тебе нужно чтобы читатели-писатели были в разных процессах. В этом случае всё намного сложнее.
0
|
||
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 12:24 [ТС] | |
|
да именно это и нужно
Добавлено через 3 минуты скоро сдача а у меня в процессах нету этого только жалкие наработки синхронизации нитей и всё и то там не всё гладко
0
|
|
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
|
|
| 26.05.2019, 14:33 | |
|
Lunch
Как я понимаю задание, поправьте если не прав. Есть один общий буфер. Читатель читает информацию из буфера, буфер при этом не меняется. Писатель перезаписывает своей информацией буфер. То есть в буфере всегда лежит информация только от одного писателя. Каждый писатель пишет свою информацию, отличную от других писателей. Никогда не делал блокировку на семафорах и не очень представляю сам алгоритм. Можно так попробовать. Создаём семафор на N элементов. Читатель ждёт один элемент. Если дождался, то читает буфер и освобождает семафор. Писатель ждёт N элементов. Если дождался всех N, то перезаписывает буфер и освобождает семафор N раз. Тут есть проблема, как ждать сразу N элементов? Если делать это в цикле, то потенциально возможен дедлок. Два писателя начинают блокировку и забирают по одному элементу. Теперь ни один из писателей не сможет получить все N элементов. При неудачной попытке нужно освобождать блокировку и пробовать снова. В общем, какой-то не внятный алгоритм блокировок выходит. Думать надо, как обойти дедлок. Второй вариант реализации, сделать через WaitForMultipleObjects. Передать в функцию N одинаковых хендлов на семафор и ждать общей блокировки. Не знаю, работает ли это так и избавит ли такой способ от дедлоков. Этот вариант нужно проверять экспериментально. Если вам дали это задание, значит ранее была озвучена какая-то теория по семафорам. Объясняли вам, каким образом делать такую блокировку? И задание про статус в мониторе не очень понятно. Содержание буфера - понятно (что там лежит), Состояние блокировки - почти понятно (выполнена, выполняется, ?не выполняется?), Состав групп читателей и писателей - понятно (сколько писателей, сколько читателей), Очереди процессов, ожидающих регистрацию в группах - совсем не понятно.
0
|
|
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 15:15 [ТС] | |
|
по поводу очереди Приоритет у писателей тоесть он пишет и в этот момент никто не может читать и никто не может писать вместе с ним .
Добавлено через 2 минуты по поводу блокировки у семафор есть макс количество потоков которые получают доступ к информации hSem = CreateSemaphore(NULL, 1, 1, "MySemaphore1"); тут 1 получает доступ максимум ну это для примера после того как поток заверщил работу он уходит и даёт сигнал следующему который занимает его место Добавлено через 1 минуту честно говоря мне и самому сложно вам объяснить потому я слабо в этом разбираюсь было супер если бы вышло реализовать Добавлено через 15 минут По поводу как делать именно такой вариант работы обьснения небыло но нам рассказывали именно как работают семафоры Программа монитор я думаю должна управлять процессами читателей и писателей и вызывать их по очереди(тоесть программы запускать) а так же выводить результаты записей и чтения файла
0
|
|
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
|
|||
| 26.05.2019, 15:41 | |||
|
Проверил, вариант с WaitForMultipleObjects не работает. Нельзя одинаковые хендлы указывать.
При RW-блокировке с общими данными одновременно может работать несколько R-потоков.
Нужно понять смысл слова "очередь" в данном контексте. Можно предположить, что речь про очередь блокировок. Не каждая реализация RW-блокировок использует очередь. Возможно тут речь про какую-то конкретную реализацию RW-блокировки.
0
|
|||
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 16:23 [ТС] | |
|
без понятия я инфы вообще нарыть не могу чтобы понять как это написать
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 26.05.2019, 16:51 | ||
|
Но! Это должно быть в одном процессе, для нескольких это реализовывать бессмысленно.
0
|
||
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 16:53 [ТС] | |
|
писатель их блокирует только когда пишет
Добавлено через 53 секунды читать могут все а писать только один пока один пишет остальные не могут чистать
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 26.05.2019, 16:54 | |
|
В нескольких процессах - тебе нужно будет организовать взаимодействие между ними.
0
|
|
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 16:57 [ТС] | |
|
да по идее
Добавлено через 24 секунды все они работают с файлом текстовым
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 26.05.2019, 16:57 | |
|
Это называется клиент-сервер. Сервер - хранит буфер и принимает данные от других процессов. Для каждого внешнего процесса пусть будет отдельный поток (херово, но пока сойдёт)
0
|
|
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 16:58 [ТС] | |
|
я пишу программу которая запускает эти программы пусть якобы по несколько раз в зависимости от количества писателей и читателей
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 26.05.2019, 16:59 | |
|
Когда на сервер приходят данные от процесса-писателя, он блокирует буфер на запись и копирует в него эти данные
Добавлено через 1 минуту Когда приходит запрос от читателя - блокирует буфер на чтение, копирует данные и отправляет их ему
0
|
|
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 17:00 [ТС] | |
|
наверное так и есть
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 26.05.2019, 17:05 | |
|
Монитором может выступать собственно сам сервер, семафор ему понадобится только чтобы контролировать количество коннектов
Добавлено через 4 минуты В общем, здесь надо сначала реализовать сервер, потом определиться с механизмом взаимодействия между процессами и реализовать его, ну а всё остальное уже мелочи
0
|
|
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
|
|
| 26.05.2019, 17:26 | |
|
Если процессов мало (всего 6), то можно сделать RW-блокировку ещё так.
Создаём 6 разных семафоров по 1 элементу. Блокировка на чтение WaitForMultipleObjects(6, <all_semaphores>, FALSE, INFINITE) Блокировка на запись WaitForMultipleObjects(6, <all_semaphores>, TRUE, INFINITE)
0
|
|
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
||||||
| 26.05.2019, 17:47 [ТС] | ||||||
0
|
||||||
|
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
|
||
| 26.05.2019, 18:42 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
| 26.05.2019, 19:19 [ТС] | |
|
Может можно что-то дописать
0
|
|
| 26.05.2019, 19:19 | |
|
Помогаю со студенческими работами здесь
20
Семафоры. Поток не дожидается свей очереди. Семафоры Семафоры Семафоры Семафоры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|