2014-02-27 305 views
1

multi_index容器我有這樣的結構:在共享內存

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東西都(爲什麼我需要一個char分配?做什麼樣的分配的,我需要在這裏等使用...)

有人可以給我解釋一下如何把這個容器共享內存?

感謝的確...

編輯:

好吧,我將我的這個代碼:

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. 

任何想法請???

+0

你需要一個char分配器來分配'char'對象的連續區域。你知道,當你分配字符串時,你會怎麼做? (從樣本中很清楚)。請告訴我們實際的代碼和你卡住的地方。目前看起來你期待着我們做你的工作? – sehe

+0

問題是我不明白,如果我有一個分配器,如在示例中的分配器,但因爲我沒有字符串,我想我也不需要該分配器。所以我認爲我必須像這個例子一樣來建立它。 http://www.boost.org/doc/libs/1_47_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.additional_containers.multi_index。我怎樣才能從其他應用程序到達容器?對不起,我不希望你做這項工作,但我不知道該怎麼做?這是我第一次使用共享內存。 – user2955554

回答

0

您是否在撥打segment.construct後檢查myDataContainer是否爲非空?也許你需要使用segment.find_or_construct

+0

感謝您的回答。我只是想,如果我從managed_shared_memory開始......在函數外面,它沒有錯誤地工作。我認爲這一定是全球性的。順便說一下,其他應用程序將如何到達我的容器? – user2955554

+0

要訪問同一個容器,分別爲內存管理器和容器使用相同的名稱「mySharedMemory」和「MyContainer」。 –

+0

我明白了,但是我的語法有問題。我必須從閱讀器應用程序到達容器,並從它執行搜索和檢索數據。你有這樣的代碼示例嗎?非常感謝你。 – user2955554