希望我的问题有道理: 在C中编程,我可以在共享内存段中创建哈希表,因此具有适当权限的任何进程都可以访问其中的键/值吗? 如果是这样,我如何在哈希表创建中指定我希望它放在SHM中? 是否有任何推荐的哈希表实现允许这个? 非常感谢
答案 0 :(得分:5)
我不知道有没有这样做的图书馆。
我知道如果您自己编写或修改现有库,那么您需要做的棘手的事情是跟踪并修复使用指针的任何代码,并将其替换为使用base + offset的代码。
基础将是共享内存创建/打开函数返回的指针,并且在每个进程中它将不同。偏移量取代了指针。当您需要通过偏移定位值时,将基数转换为char*
,将偏移量添加到该值,然后将其转换为your_type*
。类似于(bucket_t*)((char*)base + offset)
。
假设您的哈希实现需要指针。如果他们只使用单值存储桶而没有值列表,则有些人不会这样做。
另一个棘手的问题是你需要自己管理内存。您可以创建自己的函数,而不是调用malloc(),也可以将其命名为shm_hash_alloc()。一个快速的开始是只保留一个指针并在分配内存时递增它,并且不用担心释放它。稍后您可以使用指针数组(偏移量)来释放两种尺寸的各种幂的列表,或者如果您知道对象类型,则可以使用每种类型的列表。在每个空闲块中,您将指针存储到下一个空闲块,并且您知道其大小,因为它所在的列表。甚至有更好的方法,但你可能不需要它们。
答案 1 :(得分:3)
我上传了一个用于Linux的共享内存哈希表库到SF(libshmht),我开发了它的性能作为主要功能和读/写访问homegeneous访问时间。我认为它作为缓存和IPC系统是有用的。 还实现了读/写锁,以便在多个进程之间共享。
答案 2 :(得分:1)
哈希表只是一个数据结构。只要访问共享内存的模块知道如何构建结构,他们就可以访问它。只要所涉及的所有模块都知道如何阅读它,无论您使用哪种实现都无关紧要。
将其视为报纸。你创建了自己的私人记忆片段 - 这是镇上的本地报纸。然后你想与周围的所有城镇分享它 - 你可以,只要人们说同一种语言并且可以阅读它。没有特殊的分享语言,只需要每个人都能理解。
在您的情况下相同 - 您可以使用任何哈希表实现,只要所有线程都使用相同的。