Я использую boost :: interprocess :: mapped_region для хранения фиксированного массива structs
, который я разделяю между различными процессами. Это отлично работает, я обращаюсь к этим структурам с помощью смещения ID.Boost Общая память - возвращаемый вектор указателей
E.g.
Container_Struct* container = (Container_Struct*)mapped_region.get_address()
, где Container_Struct
содержит массив другой структуры, которые можно получить доступ с помощью смещения.
E.g.
MyData* data = container->dataArray[0];
Я знаю, что это не самый изящный способ обработки данных общего доступа, но я только начинающий с повышающего межпроцессного и с использованием карт и т.д. не совсем ясно для меня.
Теперь то, что я хочу сделать, это вернуть список/вектор указателей на несколько структур MyData для разных процессов.
Я, очевидно, не могу просто использовать контейнер std::vector<MyData*>
, потому что вектор является временным и недействительным среди процессов.
Как я могу создать временный вектор указателей на MyData
struct? Я не могу просто создать другой регион для хранения векторов в нем, потому что это не будет потокобезопасным, если несколько процессов запросят вектор указателей - я также не хочу никаких накладных расходов с чтением блокировки, потому что в настоящее время общие данные считываются и никогда написанных на любом процессе - поэтому синхронизации и блокировки не требуется.
Допустим, я хочу, чтобы добавить функцию в моей общей Lib, который даст мне вектор MyData*
указателей на основе списка индексных int
с, где индекс смещения в Container_Struct - как бы я это сделать?
Я не могу следовать за вами, - я уже могу поделиться указатели accross процессы легко, просто вызывая container-> DataArray [0], потому что все они отображаются в mapped_region.get_address() - моя проблема в том, как мне вернуть временный список определенных записей (указателей) этого массива basic в запросе (например, дать мои все указатели в MyData, где myData.valX = 2 – Steve
Прошу прощения. Я интерпретировал это как что-то более сложное. Если ваша проблема связана не с указателями совместного доступа в разделяемую память, я не понимаю, что конкретно.Фактически, контейнер, который вы хотите вернуть, в значительной степени похож на контейнер, который вы описываете в своем вопросе. – sehe
Возможно, вы можете упростить и просто передать список индексов в массив вместо адресов. Хотя я не вижу, как это существенно изменит задачу. – sehe