Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c将哈希表放入共享内存段_C_Hashtable_Shared Memory - Fatal编程技术网

c将哈希表放入共享内存段

c将哈希表放入共享内存段,c,hashtable,shared-memory,C,Hashtable,Shared Memory,希望我的问题有意义: 在C语言中编程,我可以在共享内存段中创建一个哈希表,这样任何具有适当权限的进程都可以访问其中的键/值吗? 如果是这样,如何在创建哈希表时指定要将其放入SHM中? 是否有任何推荐的哈希表实现允许这样做? 非常感谢哈希表只是一种数据结构。只要访问共享内存的模块知道结构是如何构建的,它们就可以访问它。使用哪种实现并不重要,只要所有涉及的模块都知道如何读取它 把它想象成一份报纸。你可以创建自己的私有内存段——这是一份城镇本地报纸。然后你想和周围所有的城镇分享它-你可以,只要人们说同

希望我的问题有意义: 在C语言中编程,我可以在共享内存段中创建一个哈希表,这样任何具有适当权限的进程都可以访问其中的键/值吗? 如果是这样,如何在创建哈希表时指定要将其放入SHM中? 是否有任何推荐的哈希表实现允许这样做?
非常感谢

哈希表只是一种数据结构。只要访问共享内存的模块知道结构是如何构建的,它们就可以访问它。使用哪种实现并不重要,只要所有涉及的模块都知道如何读取它

把它想象成一份报纸。你可以创建自己的私有内存段——这是一份城镇本地报纸。然后你想和周围所有的城镇分享它-你可以,只要人们说同样的语言并且能阅读。分享没有什么特别的语言,只有每个人都能理解的语言


在您的情况下也是如此-您可以使用任何哈希表实现,只要所有线程都使用相同的实现。

我不知道有任何库可以这样做

我知道,如果您编写自己的库或修改现有库,您需要做的棘手的事情是跟踪并修复任何使用指针的代码,并将其替换为使用base+offset的代码

基数将是共享内存创建/打开函数返回的指针,并且在每个进程中都会有所不同。偏移量将替换指针。当您需要通过偏移量定位一个值时,您可以将base强制转换为
char*
,将偏移量添加到该值中,然后将其强制转换为
your\u type*
。类似于
(bucket\u t*)((char*)base+offset)

这是假设您的哈希实现需要指针。如果只使用单值存储桶而不使用值列表,有些则不会


另一个棘手的问题是,您需要自己管理内存。不调用malloc(),而是创建自己的函数,可以将其命名为shm\u hash\u alloc()。一个快速的开始就是在分配内存时只保留一个指针并增加它,而不用费心释放它。稍后,您可以使用指针数组(偏移量)来释放两种大小的各种幂的列表,或者如果您知道对象类型,则为每种类型创建一个列表。在每个空闲块中,您存储指向下一个空闲块的指针,并且您知道其大小,因为它位于哪个列表中。甚至还有更奇特的方法,但您可能不需要它们。

我将linux共享内存哈希表库上传到SF(libshmht),我开发了它,它的主要功能是性能和读/写访问家庭访问时间。我认为它作为缓存和IPC系统是有用的。 还实现了用于在多个进程之间共享的读/写锁


谢谢,我明白你说的话。但问题是,如何实例化哈希表以便在共享内存中创建它?我见过一些HT实现只返回创建它的地址,我应该修改它以在给定地址分配内存吗?再次感谢。@klayme-是的,如果实现自行分配,那么您需要修改它以使用预先分配的内存,或者为它提供一个您实现的分配器(查看STL模板以了解如何为通用实现提供分配器的示例)。您如何使用共享内存?使用shm_open和mmap?嗯,还没有开始,但我计划使用shmget、ftok、shmat…所以,连接到共享内存的每个进程的内存地址或指针都会不同,好吗?这意味着我不能依赖使用指针的内存结构,除非我使它们都与基址相关。。。相当大的工作量。我想我只需要创建一个数组并扫描它的所有成员,直到找到我要查找的内容。事实上,我只想保留几百或几千个元素。我知道这是多么低效。我会考虑的。谢谢。很棒的图书馆。您是否已将此库部署到产品环境中?(我对它的稳定性感到担心)p.s.
shmht\u insert()
key\u size
类型在shmht.c中是
unsigned int
,但在shmht.h中是
size\u t
,这引起了我的编译器的抱怨……嗨,felix021。是的,它作为openssl进程间缓存部署到高负载环境中,没有任何问题。由于编译错误,它是为gcc编译的,可能会导致其他编译器出现一些问题。我会尽快修复。仅供参考我修复了您在第11版评论中指出的编译错误。