我有一个很难解决的简单要求。我确实找到了一些像this或this这样的潜在客户,但我似乎无法使用它们。前者甚至没有为我翻译成可构建的代码。我对Boost没有经验只是自己写这个,但在我看来这可能是一个常见的要求。
我也遇到Interprocess STL Map,但我还没有把它汇编成工作代码。
我在想boost::interprocess
是这里的方法,除非我想从头开始创建一些共享内存映射。
我不关心便携性。我需要一个适用于MS编译器的解决方案,特别是VS 2010附带的解决方案。
This poster似乎想要或多或少地想要做什么,除了我需要将GUID映射到任意长度的二进制缓冲区(但是int到string同样好作为起点)。不幸的是,即使从实验开始,我也无法干净地编译代码。
此外,我还有两个问题:A)是否可以自动(或至少可预测地)增加/缩小共享内存以满足分配需求; B)假设一个进程创建映射,另一个进程如何“附加”到它?
我不介意解决方案是否需要多个共享“段”以满足分配需求。它不一定必须是单个单片共享内存块。
非常感谢任何帮助。
答案 0 :(得分:14)
这是我最近编写的一个例子,用于了解共享内存中地图的用法。它很可能编译,你可以试验它以满足你的要求。
创建共享内存并将映射放入其中的服务器进程的代码: -
#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中创建的Map内容。 但是,在创建新的共享内存段时分配大小(此处为'65536'),我不确定是否可以缩小大小,但可能您可以创建更多的共享内存块来扩展SHM ...
希望它有所帮助...