6

我有一个可能很难解决的简单要求。我确实找到了一些这样这样的线索,但我似乎无法轻松使用它们。前者甚至没有为我翻译成可构建的代码。我对 Boost 没有经验,只能自己写这个,但在我看来,这可能是一个常见的要求。

我也遇到过Interprocess STL Map,但我还不能将它组装成工作代码。

我在想boost::interprocess是去这里的路,除非我想从头开始创建一些共享内存映射。

我不关心便携性。我需要一个可以与 MS 编译器一起使用的解决方案,特别是 VS 2010 附带的那个。

这张海报似乎或多或少想要做我想做的事情,除了我需要将 GUID 映射到任意长度的二进制缓冲区(但 int 到字符串同样可以作为起点)。不幸的是,我无法干净地编译代码,甚至无法从实验开始。

另外我有两个担忧:A)是否可以自动(或至少可预测地)增长/缩小共享内存以适应分配需求和 B)假设一个进程创建映射,另一个进程如何“附加”到它?

我不介意解决方案是否需要多个共享“段”以满足分配需求。它不一定必须是单个整体共享内存块。

非常感谢任何帮助。

4

1 回答 1

18

这是我为学习共享内存中映射的使用而编写的最近的示例。它编译得如此可能,您可以尝试使用它来满足您的要求。

创建共享内存并将映射放入其中的服务器进程的代码:-

#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());

    // 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>
#include <iostream>

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 ...

希望它有所帮助...

于 2012-10-24T18:51:03.020 回答