Кросс-платформенная C++ с общей памятью

Я пишу на С++ программу, которая работает как сокет между другими программами на разных языках (до сих пор С#, python). Этот сокет считывает данные с USB-порта, выполняет какие-то действия и передает их другим программам.

Моя идея: каждая программа просит через порт-массаж быть частью потока. В ответ эта программа получает указатель на разделяемую память. Это возможно? общая память на разных языках программирования? и могу ли я просто передать указатель на общую память другой программе? и есть ли способ сделать это кроссплатформенным? (ЮНИКС и ОКНА)

с наилучшими пожеланиями Кнут

Если программы работают на одном ПК, вместо общей памяти можно использовать каналы. Это более высокий уровень и ориентированный на сообщения (поэтому он кажется более подходящим для трансляции событий/данных).

wohlstad 08.05.2022 16:08

@wohlstad Мне нужно передать много данных из моей программы в кучу других за короткое время. Я думаю, что каналы не такие быстрые по сравнению с общей памятью ... или? Если я ошибаюсь, подскажите :)

L.knaeble 08.05.2022 18:14

Пайпы довольно быстрые. По крайней мере, в Windows он все равно использует общую память (не уверен в Linux и т. д.). Конечно, вам нужно будет профилировать его, если производительность имеет решающее значение.

wohlstad 08.05.2022 18:18

Добавил альтернативу трубы в качестве полного ответа.

wohlstad 08.05.2022 18:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Is this possible? shared memory over different programing-languages?

Да. Память есть память, поэтому к области разделяемой памяти, созданной языком А, может обращаться программа, написанная на языке Б.

and can I just passe the pointer to the shared memory to the other program?

Это не так просто; другая программа не сможет получить доступ к области совместно используемой памяти, пока она не сопоставит эту же область со своим собственным виртуальным адресным пространством, используя шмат() или MapViewOfFile() или подобное.

Обратите внимание, что область общей памяти, скорее всего, будет сопоставлена ​​с другим диапазоном адресов в каждом присоединенном к ней процессе, поэтому не полагайтесь на то, что указатель на фрагмент общих данных в процессе A совпадает с указателем на те же данные в процессе B.

and is there a way to do it cross-platform ?

Похоже, у boost есть API для общей памяти, если вы хотите пойти по этому пути. В качестве альтернативы вы можете написать свой собственный API с общей памятью с другим кодом внутри файла .cpp для Windows и ОС POSIX с соответствующими #ifdefs. Это как я сделал в моей библиотеке, и он работает нормально.

нанес на карту тот же регион Разве это не ограничение для разделяемой памяти? Доза это не означает, что я должен использовать один и тот же инструмент для «сопоставления той же области»? и я не могу использовать «шамт» на каждом языке... Так что я также создал библиотеку C для доступа к хранилищу?
L.knaeble 08.05.2022 18:32

Вы должны использовать какой-то вызов API, который знает, как получить доступ к разделяемой памяти ОС… в разных языках могут быть разные способы сделать это, но все они в конечном итоге обращаются к API ОС.

Jeremy Friesner 08.05.2022 18:41

Если вы хотите использовать общую память, приведенный выше ответ (от @JeremyFriesner) очень хороший.

Однако в качестве альтернативы использованию разделяемой памяти можно рассмотреть именованные каналы.
Немного общей информации: Именованная труба — Википедия.

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

По производительности они достаточно эффективны. Но, конечно, вам придется профилировать его для вашего конкретного случая.

API доступен для всех упомянутых вами языков (и многих других):
Для C# (в Windows): Практическое руководство. Использование именованных каналов для сетевого взаимодействия между процессами.
Для C++: в Windows: Именованные каналы — Win32 и Linux: Именованные каналы — Linux.
Для Python: Именованные каналы Python.

Другие вопросы по теме