我正在尝试共享一个无序映射(散列映射),但它在尝试将数据插入映射的那一行以浮点异常结束。
有人可以帮助理解我哪里出错了吗?
#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;
}
谢谢。
最佳答案
一般来说,您不能在进程之间共享复杂的结构。特别是,指向一个进程的虚拟地址空间中的对象的指针在另一个进程中将无效,并且大多数容器实现都将涉及指针。
你可以看看 Boost.Interprocess包含适合共享的各种容器和分配器的库;特别是他们的 unordered_map
版本 can be placed in shared memory ,只要您使用它们的共享内存分配器,您就可以简单地使用它来替代 std::unordered_map
(尽管您仍然需要替代 std: :string
作为键)。
关于c++ - 将无序映射写入共享内存不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11761517/