Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
.NET 4.x

Межпроцессорный сигналинг

29.02.2016, 03:41. Показов 732. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я передаю данные через МемориМаппедФайл*MMF (между 2я процессами), один процесс пишет, другой читает.
Если запустить параллельно, без доп защиты - происходит эффект "затирания" если считка и записи попадут в один и тот же момент.
Сейчас у меня транслируется:
1й байт - бул (флаг, идёт ли запись)
(некст)4 байта - длинна объекта(длинна массива)
(некйс)массив байт (объект)

С флагом в первом байте работает не "ах ти", тот же эффект затирания всё равно проявляется + подтормаживает.

Приложение "писатель", пишет из множества потоков в свои MMF объекты.

Хотел было юзать Mutex для не вышло... т.к. его можно вызывать только из синхронизированного блока кода, а как я выше написал, у меня асинх. код.
Нужно какой-то вариант межпроцессорного сигналинга, да бы остановить считку в момент записи (но как можно на более короткое время).

Какие варианты решения??
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.02.2016, 03:41
Ответы с готовыми решениями:

Межпроцессорный мьютекс linux
Вопрос. В Windows при создании мьютекса CreateMutexA(NULL,false,"NameOfMyMytex") - создаётся мьютекс, который может использоваться для...

Fatal error LNK1104. Удаленный, межпроцессорный com объект
Пытаюсь собрать makefile из урока Дейла Роджерсона. Вылезает ошибка LINK : fatal error LNK1104 cannot open file 'libcimtd.lib'. На форумах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
29.02.2016, 04:01
Fast shared Array, Buffer and Circular Buffer / Ring Buffer for .NET IPC with Memory Mapped Files пробовали?
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.02.2016, 11:02
Цитата Сообщение от DarkOrk Посмотреть сообщение
один процесс пишет, другой читает. Какие варианты решения??
Почему не сделать просто обмен по TCP? На локальной машине это будет практически мгновенно.
Как бонус - возможность разнесения по разным машинам.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.02.2016, 12:08
Цитата Сообщение от Storm23 Посмотреть сообщение
Почему не сделать просто обмен по TCP? На локальной машине это будет практически мгновенно.
Намного медленнее, чем через разделямую память.
По крайней мере, в Windows. К тому же для TCP нужен отдельный порт,
который гарантированно свободен. IMHO, TCP для межпроцессного
обмена в рамках одной машины как-то не очень.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.02.2016, 12:35
Цитата Сообщение от Убежденный Посмотреть сообщение
Намного медленнее, чем через разделямую память.
По крайней мере, в Windows. К тому же для TCP нужен отдельный порт,
который гарантированно свободен. IMHO, TCP для межпроцессного
обмена в рамках одной машины как-то не очень.
Ну я предлагаю просто как вариант.
Касаемо порта - да порт нужен. Но и для файла фиксированное имя тоже нужно, что тоже не очень.
Касаемо скорости - я конечно специально не мерял, но не очень понимаю с чего бы оно могло тормозить. Ведь на локалхосте пакеты даже через сетевую карту не идут, только через драйвер сети. То есть весь процесс обмена идет только через память, что не сильно отличается от MMF.
Зато есть очевидные плюсы:
1) Готовая инфраструктура сигналинга. Асинхронный сокет выдает событие о приходе данных. Никаких бесконечных циклов проверки, никаких коллизий записи/чтения, никаких "флаг, идёт ли запись". Данные от отправителя напрямую приходят к получателю.
2) Да, свободный порт нужен. На зато мы получаем автоматически запрет на запуск второго экземпляра приложения(которое не запустится, потому что порт будет занят). В случае MMF - что произойдет если будет запущен второй экземпляр "писателя"?
3) Сокеты - это full-duplex. MMF - в общем случае нет (если файл - один).
4) Масштабируемость, о чем я уже писал.

В общем, в определенных случаях такой вариант не так уж и плох. Я так делал в некоторых проектах, работало нормально.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.02.2016, 13:17
Цитата Сообщение от Storm23 Посмотреть сообщение
Касаемо порта - да порт нужен. Но и для файла фиксированное имя тоже нужно, что тоже не очень.
Для MMF можно сгенерировать имя типа "Global\\{xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}",
которое имеет все шансы быть достаточно уникальным. А вот найти свободный порт,
который гарантированно никем не будет занят - это проблема посложнее.

Цитата Сообщение от Storm23 Посмотреть сообщение
Касаемо скорости - я конечно специально не мерял, но не очень понимаю с чего бы оно могло тормозить. Ведь на локалхосте пакеты даже через сетевую карту не идут, только через драйвер сети. То есть весь процесс обмена идет только через память, что не сильно отличается от MMF.
В Windows любые сокетные операции на localhost проходят, как минимум, через стек WinSock-
провайдеров, потом переключение в ядро, потом через верх стека TCP/IP (afd.sys/tcpip.sys),
там они могут еще фильтроваться антивирусами/фаерволами, иногда в отложенном режиме.
В итоге может вылиться в тысячи тактов. А когда обмен идет через MMF, то даже
системных вызовов нет, просто чтение и запись в память. Т.е. суммарный перфоманс
может различаться на порядки.

Цитата Сообщение от Storm23 Посмотреть сообщение
1) Готовая инфраструктура сигналинга. Асинхронный сокет выдает событие о приходе данных. Никаких бесконечных циклов проверки, никаких коллизий записи/чтения, никаких "флаг, идёт ли запись". Данные от отправителя напрямую приходят к получателю.
Да, согласен. Вообще, MMF в сравнении с сокетами или пайпами - это разные модели
передачи данных. У MMF нет сигналинга "из коробки".

Цитата Сообщение от Storm23 Посмотреть сообщение
2) Да, свободный порт нужен. На зато мы получаем автоматически запрет на запуск второго экземпляра приложения(которое не запустится, потому что порт будет занят). В случае MMF - что произойдет если будет запущен второй экземпляр "писателя"?
Ничего страшного не произойдет, CreateFileMapping вернет успех, но в last error
будет записано ERROR_ALREADY_EXISTS. Т.е. можно ограничить запуск второго писателя,
если нужно.

Цитата Сообщение от Storm23 Посмотреть сообщение
3) Сокеты - это full-duplex. MMF - в общем случае нет (если файл - один).
Ну почему же?
В MMF можно писать и читать в оба конца одновременно.
Другое дело - как это все синхронить и разруливать.

Цитата Сообщение от Storm23 Посмотреть сообщение
4) Масштабируемость, о чем я уже писал.
Это да. Если нужно, к примеру, обмениваться данными в локальной сети, то
вряд ли есть что-то лучше, чем сокеты или пайпы (или RPC поверх них).

Цитата Сообщение от Storm23 Посмотреть сообщение
В общем, в определенных случаях такой вариант не так уж и плох. Я так делал в некоторых проектах, работало нормально.
В определенных случаях - безусловно. Но далеко не всегда и не везде.
Просто TCP и сокеты довольно часто советуют для IPC, хотя, на мой взгляд,
требование свободного порта и long path - довольно существенные недостатки
данного способа, чтобы ими пренебрегать.
1
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
29.02.2016, 13:46
Чем не устраивает WCF PIPE? Кажется именно для этих задач пайпы и были придуманы?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.02.2016, 14:20
Цитата Сообщение от Storm23 Посмотреть сообщение
Почему не сделать просто обмен по TCP?
Тогда уж именованные каналы, это еще быстрее.
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
29.02.2016, 14:59
Цитата Сообщение от DarkOrk Посмотреть сообщение
Какие варианты решения??
Пойдёт? https://gorillacoding.wordpres... unication/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru