Совместно используемая карта с boost :: interprocess

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

Я тоже сталкивался Интерпроцесс STL Карта но я еще не смог собрать его в рабочий код.

я думаю boost::interprocess это путь, если я не хочу создавать карту общей памяти с нуля.

Я не обеспокоен переносимостью. Мне нужно решение, которое будет работать с компилятором MS, особенно то, которое поставляется с VS 2010.

Этот постер кажется, хочет более или менее то, что я пытаюсь сделать, за исключением того, что мне нужно сопоставить GUID с двоичным буфером произвольной длины (но int в строку одинаково хорош как отправная точка). К сожалению, я не могу скомпилировать код, чтобы даже начать эксперименты.

Также у меня есть две проблемы: A) возможно ли автоматически (или, по крайней мере, предсказуемо) увеличить / уменьшить общую память для удовлетворения потребностей в распределении и B) если один процесс создает карту, как другой процесс может «присоединиться» к ней?

Я не против, если решение требует нескольких общих «сегментов» для удовлетворения потребностей распределения. Это не обязательно должен быть один монолитный разделяемый кусок памяти.

Любая помощь высоко ценится.

4

Решение

Вот недавний пример, который я написал, чтобы изучить использование карт в общей памяти. Он компилируется, поэтому вы можете поэкспериментировать с ним, чтобы удовлетворить ваши требования.

Код для серверного процесса, который создает общую память и помещает в нее карту: —

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <functional>
#include <utility>

int main ()
{
using namespace boost::interprocess;

// remove earlier existing SHM
shared_memory_object::remove("SharedMemoryName");

// create new
managed_shared_memory segment(create_only,"SharedMemoryName",65536);

//Note that map<Key, MappedType>'s value_type is std::pair<const Key, MappedType>,
//so the allocator must allocate that pair.
typedef int    KeyType;
typedef float  MappedType;
typedef std::pair<const int, float> ValueType;

//allocator of for the map.
typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator;

//third parameter argument is the ordering function is used to compare the keys.
typedef map<KeyType, MappedType, std::less<KeyType>, ShmemAllocator> MySHMMap;

//Initialize the shared memory STL-compatible allocator
ShmemAllocator alloc_inst (segment.get_segment_manager());

//Construct a shared memory map.
MySHMMap *mymap =  segment.construct<MySHMMap>("MySHMMapName") (std::less<int>() ,alloc_inst);

// offset ptr within SHM for map
offset_ptr<MySHMMap> m_pmap = segment.construct<MySHMMap>("MySHMMapName")(std::less<int>(), alloc_inst);

//Insert data in the map
for(int i = 0; i < 10; ++i)
{
m_pmap->insert(std::pair<const int, float>(i, (float)i));
}

return 0;
}

Код для клиентского процесса, который подключается к памяти и обращается к данным карты.

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <functional>
#include <utility>

int main ()
{
using namespace boost::interprocess;

try
{

managed_shared_memory segment(open_or_create, "SharedMemoryName",65536);

//Again the map<Key, MappedType>'s value_type is std::pair<const Key, MappedType>, so the allocator must allocate that pair.
typedef int    KeyType;
typedef float  MappedType;
typedef std::pair<const int, float> ValueType;

//Assign allocator
typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator;

//The map
typedef map<KeyType, MappedType, std::less<KeyType>, ShmemAllocator> MySHMMap;

//Initialize the shared memory STL-compatible allocator
ShmemAllocator alloc_inst (segment.get_segment_manager());

//access the map in SHM through the offset ptr
MySHMMap :: iterator iter;
offset_ptr<MySHMMap> m_pmap = segment.find<MySHMMap>("MySHMMapNAme").first;

iter=m_pmap->begin();
for(; iter!=m_pmap->end();iter++)
{
std::cout<<"\n "<<iter->first<<" "<<iter->second;
}
}catch(std::exception &e)
{
std::cout<<" error  " << e.what() <<std::endl;
shared_memory_object::remove("SharedMemoryName");
}
return 0;
}

Код для клиентского процесса объясняет, как с помощью «имен» и указателя смещения другие процессы могут присоединять и получать доступ к содержимому карты, созданному в SHM серверным процессом.
Но, выделяя размер (здесь это «65536») при создании нового сегмента разделяемой памяти, я не уверен, можно ли уменьшить размер, хотя, возможно, вы сможете создать больше кусков разделяемой памяти для расширения SHM …

Надеюсь, это помогло …

12

Другие решения

Других решений пока нет …