Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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_Dll_Data Structures_Shared Libraries_Shared Memory - Fatal编程技术网

C 哪种数据结构最适合共享内存场景和快速查找

C 哪种数据结构最适合共享内存场景和快速查找,c,dll,data-structures,shared-libraries,shared-memory,C,Dll,Data Structures,Shared Libraries,Shared Memory,我仍处于项目的概念阶段。尚未开始代码实现。子任务是: 2进程将从通常访问的DLL请求数据。这个DLL将把这些数据存储在内存中的缓冲区中。如果我只是在DLL中实例化一个结构并在其中存储数据,那么每个流程实例都将有一个单独的结构,并且数据不会是公共的。所以我需要一个共享内存实现。现在我的另一个要求是在数据中快速查找时间。我不确定如何在共享内存空间中存储AVL树。互联网上是否有可以存储在共享内存空间中的AVL树/哈希映射的实现?此外,这是解决问题的正确方法吗?或者我应该使用其他东西吗 蒂亚 这是否是正

我仍处于项目的概念阶段。尚未开始代码实现。子任务是:

2进程将从通常访问的DLL请求数据。这个DLL将把这些数据存储在内存中的缓冲区中。如果我只是在DLL中实例化一个结构并在其中存储数据,那么每个流程实例都将有一个单独的结构,并且数据不会是公共的。所以我需要一个共享内存实现。现在我的另一个要求是在数据中快速查找时间。我不确定如何在共享内存空间中存储AVL树。互联网上是否有可以存储在共享内存空间中的AVL树/哈希映射的实现?此外,这是解决问题的正确方法吗?或者我应该使用其他东西吗


蒂亚

这是否是正确的方法取决于各种因素,如数据的生成成本、流程是否需要就数据进行相互通信等等。这个答案的其余部分假设您确实需要共享内存中的查找结构

您可以使用任何数据结构,前提是您可以在共享内存空间中为数据和数据结构的内部结构分配存储。这通常意味着您将无法对其使用
malloc
,因为每个进程的堆通常保持私有。您将需要自己的自定义分配器

假设您选择了AVL树。这里有一个实现它们的库:。在这个库中,“内部”AVL节点数据以入侵方式存储在“对象”中。入侵意味着在声明对象
struct
时保留库使用的字段。因此,只要使用自定义分配器为共享内存中的对象分配空间,并且也为根目录树
struct
分配空间,整个目录树就应该可以被多个进程访问。您只需确保共享内存本身在每个进程中映射到相同的地址范围

如果您使用非侵入式AVL实现,这意味着每个节点都由一个内部
结构表示,然后该结构指向一个单独的
struct
,其中包含您的数据,则库或您的实现必须允许您以某种方式为内部
struct
指定分配器,这样您就可以确保在共享内存中分配空间

至于如何编写自定义分配器,这实际上取决于您的使用情况和系统。您需要考虑是否需要“调整”共享内存区域,系统是否允许您这样做,您是否将只分配区域内的固定宽度块,或者需要支持任意长度的块,是否可以将数据结构扩展到多个共享内存区域,您的流程如何进行同步和通信,等等。如果你走这条路,你应该问一个关于这个话题的新问题。请务必提及您正在使用的系统(Windows?)以及您的限制条件

编辑

为了进一步阻止您这样做,除非有必要:例如,如果您的数据生成成本很高,但您不关心进程是否在数据可用时建立自己的独立查找结构,那么您可以让DLL将数据写入共享内存中的简单环形缓冲区,剩下的代码从这里开始。构建两棵AVL树并不是一个真正的问题,除非它们非常大


另外,如果您只关心并发性,并且有两个进程并不重要,那么您可以将它们都设置为一个进程的两个线程。

对于Windows,Microsoft推荐的函数可以为每个进程返回指向共享内存的不同指针值。这意味着在共享内存中,必须使用偏移量(从共享内存开始)而不是指针。例如,在链表中,存在下一个偏移量而不是下一个指针。您可能需要创建宏来将偏移量转换为指针,并将指针转换为偏移量。

我认为您提出的问题不对。数据结构的选择在很大程度上与是否使用共享内存是正交的。它确实有一些影响,但更重要的是您的预期数据(值、分布、数据集大小等)和预期的常见操作(例如,插入、删除和查找的数量)。