Один из механизмов межпроцессного взаимодействия, который вы определенно можете использовать для совместного использования прямого доступа к вашей матрице M
, - это общая память . Это означает, что ОС позволяет нескольким процессам получать доступ к общему сегменту в памяти, как если бы он находился в их адресном пространстве, сопоставляя его для каждого запрашивающего. Решение, которое отвечает всем вашим требованиям, а также является кроссплатформенным, - boost :: interprocess . Это тонкий переносимый уровень, который охватывает все необходимые вызовы ОС. Смотрите рабочий пример справа здесь, в документе .
По сути, вашему серверному процессу просто нужно создать объект типа boost::interprocess::shared_memory_object
, предоставив конструктору имя для общего сегмента. При вызове метода truncate()
ОС будет искать достаточно большой сегмент в адресном пространстве этого серверного процесса. С этого момента любой другой процесс может создать объект того же типа и предоставить то же имя . Теперь он тоже имеет доступ к точно такой же памяти. Копии не принимаются.
Если по какой-то причине вы не можете использовать переносимые библиотеки Boost или по другой причине хотите ограничить поддерживаемую платформу для Linux, используйте POSIX API вокруг функции mmap()
. Вот справочная страница Linux . Использование в основном недалеко от конвейера Boost , описанного выше. Вы создаете именованный сегмент с shm_open()
и усечением с ftruncate()
. Оттуда вы получите сопоставленный указатель на это выделенное пространство, вызвав mmap()
. В более простых случаях, когда вы будете делиться только между родительскими и дочерними процессами, вы можете использовать этот пример кода с этого сайта .
Конечно, независимо от того, какой подход вы используете, при использовании общего ресурса обязательно синхронизируйте чтение / запись должным образом, чтобы избежать каких-либо условий гонки - как вы сделали бы в сценарии с несколькими потоками одного и того же процесса. .