|
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 147
|
|
Семафоры26.05.2019, 11:21. Показов 6205. Ответов 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
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
|
|
| 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
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
|
|||
| 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
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
|
|
| 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
|
||||||
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
|
||
| 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
Семафоры. Поток не дожидается свей очереди. Семафоры Семафоры Семафоры Семафоры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|