【问题标题】:multi_index container in shared memory共享内存中的 multi_index 容器
【发布时间】:2014-02-27 08:58:51
【问题描述】:

我有这个结构:

struct myData
{   
    unsigned long id;
    int age; 
    int phone;

    myData(){};
    myData(unsigned long id_, int age_, int phone_)
        :id(id_),age(age_),phone(phone_){}
    ~myData(){};
};

这个 multi_index 容器:

typedef multi_index_container<
    myData, 
        indexed_by<    
            random_access<>,  // keep insertion order
            ordered_non_unique< member<myData, int, &myData::age> >
        >
> myDataContainerType;

typedef myDataContainerType::nth_index<1>::type myDataContainerType_by_Id;
myDataContainerType myDataContainer;

还有这个插入函数:

bool insert(unsigned long id, int age, int phone) { 

    myDataContainerType::iterator it; 
    bool success; 
    boost::mutex::scoped_lock scoped_lock(mutex); // LOCK
    std::pair<myDataContainerType::iterator, bool> result = myDataContainer.push_back(myData(id, age, phone)); 
    it = result.first; 
    success = result.second; 
    if (success) 
        return true; 
    else 
        return false; 
} 

所以我想把这个 muti_index 容器放到shared memory 以使其也可以从其他应用程序访问。我看到thisthat 的例子,但我根本不明白allocator 的东西(为什么我需要一个字符分配器?我需要在这里使用什么样的分配器等等......)

谁能解释我如何把这个容器放到共享内存中?

真的谢谢...

编辑:

好的,我添加了我的代码:

myDataContainerType *myDataContainer ;

void createInSharedMemory()
{
    managed_shared_memory segment(create_only,"mySharedMemory", 65536);

    myDataContainer = segment.construct<myDataContainerType>
        ("MyContainer")            //Container's name in shared memory
        ( myDataContainerType::ctor_args_list()
        , segment.get_allocator<myData>());  //Ctor parameters

}

并尝试像这样插入数据:

bool insert(unsigned long id, int age, int phone) { 

    myDataContainerType::iterator it; 
    bool success; 
    boost::mutex::scoped_lock scoped_lock(mutex); // LOCK
    std::pair<myDataContainerType::iterator, bool> result = myDataContainer->insert(MyData(id, age, phone));    

    it = result.first; 
    success = result.second; 
    if (success) 
        return true; 
    else 
        return false; 
} 

但我在插入行中收到此错误:(在 offset_ptr.hpp 中)

Unhandled exception at 0x000000013fa84748 in LDB_v1.exe: 0xC0000005: Access violation reading location 0x0000000001d200d0.

有什么想法吗???

【问题讨论】:

  • 您需要一个字符分配器来分配char 对象的连续区域。你知道,当你分配字符串时你会做什么? (从样本中可以很清楚地看到)。请向我们展示实际代码以及您遇到的问题。目前看来您希望我们为您工作?
  • 问题是我不明白我是否有像示例中那样的分配器,但由于我没有字符串,我想我也不需要那个分配器。所以我想我必须像这个例子一样构建它。 boost.org/doc/libs/1_47_0/doc/html/interprocess/…。如何从其他应用程序访问容器?对不起,我不希望你做这项工作,只是我不知道该怎么做?这是我第一次使用共享内存。

标签: c++ visual-studio-2008 boost shared-memory multi-index


【解决方案1】:

在调用segment.construct 后,您是否检查过myDataContainer 是否为非空?也许您需要改用segment.find_or_construct

【讨论】:

  • 感谢您的回答。我刚刚发现,如果我以 managed_shared_memory... 开头的行在函数之外,它可以正常工作。我认为它必须是全球性的。顺便问一下,其他应用程序如何到达我的容器?
  • 要访问同一个容器,内存管理器和容器分别使用相同的名称“mySharedMemory”和“MyContainer”。
  • 我明白了,但语法有问题。我必须从阅读器应用程序访问容器并从中执行搜索和检索数据。你有任何示例代码可以这样工作吗?非常感谢。
  • 在写进程中构造容器的find_or_construct代码可以用来从读进程访问容器。其余的是 multi_index_container* 的通常同步使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2015-09-25
  • 2019-12-17
相关资源
最近更新 更多