2015-01-22 3 views
2

Я использую 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 - как бы я это сделать?

ответ

0

Вы бы использовать вектор boost::interprocess::offset_ptr для обмена указателей внутри сегмента памяти таким образом, что указатели могут использоваться в различных процессах, например:

template <typename T> 
using Ptr = boost::interprocess::offset_ptr<T>; 

template <typename T> 
using SharedVector = std::vector< 
     Ptr<T>, 
     boost::interprocess::allocator<Ptr<T>, boost::interprocess::shared_memory_segment::segment_manager>; 

Конечно, вы потребность иметь фактический T, указала также на тот же сегмент памяти для offset_ptr, чтобы иметь возможность работать.

Похоже, теперь, что вы на самом деле лучше использовать

  • повышение :: multi_index_container (который может главные (несколько) индексы в контейнер) и понимающих Повысьте межпроцессные распределители просто отлично

  • Boost Intrusive контейнеры (которые могут образовывать коллекцию «простых» объектов, которые живут «где-то еще»). Предопределённые Интрузивные Крючки понять, как использовать boost::interprocess::offset_ptr просто отлично

+0

Я не могу следовать за вами, - я уже могу поделиться указатели accross процессы легко, просто вызывая container-> DataArray [0], потому что все они отображаются в mapped_region.get_address() - моя проблема в том, как мне вернуть временный список определенных записей (указателей) этого массива basic в запросе (например, дать мои все указатели в MyData, где myData.valX = 2 – Steve

+0

Прошу прощения. Я интерпретировал это как что-то более сложное. Если ваша проблема связана не с указателями совместного доступа в разделяемую память, я не понимаю, что конкретно.Фактически, контейнер, который вы хотите вернуть, в значительной степени похож на контейнер, который вы описываете в своем вопросе. – sehe

+0

Возможно, вы можете упростить и просто передать список индексов в массив вместо адресов. Хотя я не вижу, как это существенно изменит задачу. – sehe

Смежные вопросы