Я пишу на С++ программу, которая работает как сокет между другими программами на разных языках (до сих пор С#, python). Этот сокет считывает данные с USB-порта, выполняет какие-то действия и передает их другим программам.
Моя идея: каждая программа просит через порт-массаж быть частью потока. В ответ эта программа получает указатель на разделяемую память. Это возможно? общая память на разных языках программирования? и могу ли я просто передать указатель на общую память другой программе? и есть ли способ сделать это кроссплатформенным? (ЮНИКС и ОКНА)
с наилучшими пожеланиями Кнут
@wohlstad Мне нужно передать много данных из моей программы в кучу других за короткое время. Я думаю, что каналы не такие быстрые по сравнению с общей памятью ... или? Если я ошибаюсь, подскажите :)
Пайпы довольно быстрые. По крайней мере, в Windows он все равно использует общую память (не уверен в Linux и т. д.). Конечно, вам нужно будет профилировать его, если производительность имеет решающее значение.
Добавил альтернативу трубы в качестве полного ответа.





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. Это как я сделал в моей библиотеке, и он работает нормально.
Вы должны использовать какой-то вызов API, который знает, как получить доступ к разделяемой памяти ОС… в разных языках могут быть разные способы сделать это, но все они в конечном итоге обращаются к API ОС.
Если вы хотите использовать общую память, приведенный выше ответ (от @JeremyFriesner) очень хороший.
Однако в качестве альтернативы использованию разделяемой памяти можно рассмотреть именованные каналы.
Немного общей информации: Именованная труба — Википедия.
API именованных каналов более высокоуровневый, чем общая память. Вместо необработанного блока памяти, которым нужно управлять самостоятельно (в том числе с использованием какого-либо механизма межпроцессорной блокировки, такого как именованный мьютекс, для доступа к общим данным), вы получаете транспортный уровень для сообщений.
По производительности они достаточно эффективны. Но, конечно, вам придется профилировать его для вашего конкретного случая.
API доступен для всех упомянутых вами языков (и многих других):
Для C# (в Windows): Практическое руководство. Использование именованных каналов для сетевого взаимодействия между процессами.
Для C++: в Windows: Именованные каналы — Win32 и Linux: Именованные каналы — Linux.
Для Python: Именованные каналы Python.
Если программы работают на одном ПК, вместо общей памяти можно использовать каналы. Это более высокий уровень и ориентированный на сообщения (поэтому он кажется более подходящим для трансляции событий/данных).