2012-08-01 49 views
-1

我想共享一個無序的映射(哈希映射),但它結束時浮動點異常在它嘗試在地圖中插入數據的行。編寫一個無序的映射到共享內存不工作

難道有人請幫忙瞭解我哪裏出錯了嗎?

#include <iostream> 
#include <string> 
#include <unordered_map> 

#include <sys/ipc.h> 
#include <sys/shm.h> 
int main() 
{ 
    std::unordered_map<std::string,double> *tmp; 

    key_t key = 5678; 
    int shmid = shmget(key, 1000, IPC_CREAT | IPC_EXCL | 644); 
    if(shmid == -1){ 
     std::cerr << "Failed to create the shared segment." << std::endl; 
     exit(-1); 
    } 

    void *addr = shmat(shmid, NULL, 0); 
    if(addr == (void*)-1){ 
     std::cerr << "Failed to attach the segment to the process." << std::endl; 
     exit(-1); 
    } 

    tmp = static_cast< std::unordered_map<std::string,double>* >(addr); 
    tmp->insert (std::pair<std::string,double>("abc",1.2)); 

    shmdt(addr); 
    return 0; 
} 

謝謝。

+0

我不認爲shmat返回的類型std :: unordered_map *和void *與static_cast正常工作有關。 – coelhudo 2012-08-01 14:48:58

回答

5

通常,您不能在進程之間共享複雜的結構。特別是,指向一個進程的虛擬地址空間中的對象的指針在另一個進程中不會有效,並且大多數容器實現都會涉及指針。

您可以查看Boost.Interprocess庫,其中包含適合共享的各種容器和分配器;特別是他們的版本unordered_mapcan be placed in shared memory,只要你使用他們的共享內存分配器,所以你可以簡單地使用它作爲std::unordered_map的替代品(儘管你仍然需要替換std::string作爲關鍵)。

+1

理論上,自定義分配器應該允許這樣做。 (實際上,我有些懷疑。) – 2012-08-01 15:11:43

+0

@JamesKanze:確實,我也懷疑,甚至沒有提出這個建議。你會依賴容器的非常一致的實現,如果某些實現失敗了,例如'pointer'不是'T *',那麼我不會感到驚訝。 – 2012-08-01 15:21:24

+0

所以它是如此複雜,最好採用其他方法,如果是這種情況,最好的選擇是什麼?我想要一個哈希映射在進程間共享。請提出建議。我有點卡住 – mandeep 2012-08-03 09:16:08

1

您正在將您的共享內存地址轉換爲指向地圖的指針,但您永遠不會調用構造函數以實際在該地址創建地圖。無論如何,這可能不會按照你想要的方式工作,因爲地圖可能會分配和釋放內存以供自己使用,這些內存將來自堆,而不是來自共享內存區。