gpt4 book ai didi

c++ - 模块间共享内存

转载 作者:IT王子 更新时间:2023-10-28 23:34:08 25 4
gpt4 key购买 nike

我想知道如何在不同的程序模块之间共享一些内存 - 比如说,我有一个主应用程序 (exe),然后是一些模块 (dll)。它们都链接到同一个静态库。这个静态库将有一些提供各种服务的管理器。我想要实现的是让这个管理器在所有应用程序模块之间共享,并在库初始化期间透明地执行此操作。在进程之间我可以使用共享内存,但我希望它只在当前进程中共享。你能想出一些跨平台的方法来做到这一点吗?可能使用 boost 库,如果它们提供了一些工具来执行此操作。

我现在能想到的唯一解决方案是使用各自操作系统的共享库,所有其他模块将在运行时链接到该库,并将管理器保存在那里。

编辑:为了澄清我真正需要的东西:

  1. 我需要确定是否已经创建了共享管理器(下面的答案已经提供了一些方法)
  2. 获取指向管理器的指针(如果存在),或将指针设置到新创建的管理器对象的某个位置。

最佳答案

我认为您需要共享库的帮助才能以任何可移植方式执行此操作。它不一定需要知道关于模块之间共享的对象的任何信息,它只需要提供一些从键(可能是字符串)到指针的全局可访问映射。

但是,如果您愿意调用操作系统 API,这是可行的,而且我认为您可能只需要操作系统特定部分的两种实现(一种用于 Windows DLL 和 GetProcAddress,一种用于使用 dlopen 的操作系统)。

当每个模块加载时,它会遍历先前加载的模块列表,寻找任何导出特殊命名函数的模块。如果它找到一个(任何一个都没有关系,因为不变式是所有完全加载的模块都知道公共(public)对象),它从先前加载的模块中获取公共(public)对象的地址,然后增加引用计数.如果找不到,它会分配新数据并初始化引用计数。在模块卸载期间,它会减少引用计数并在引用计数为零时释放公共(public)对象。

当然,有必要为公共(public)对象使用操作系统分配器,因为虽然不太可能,但它可能是从与第一次加载它的库不同的库中释放的。这也意味着公共(public)对象不能包含任何虚函数或任何其他类型的指向不同模块段的指针。它的所有资源必须使用 OS 进程范围的分配器动态分配。对于 libc++ 是共享库的系统,这可能不是一个负担,但您说您正在静态链接 CRT。

Win32 中需要的函数包括 EnumProcessModulesGetProcAddressHeapAllocHeapFreeGetProcessHeap GetCurrentProcess.

考虑到一切,我想我会坚持将公共(public)对象放在它自己的共享库中,它利用加载器的数据结构来找到它。否则,您将重新发明装载机。即使 CRT 静态链接到多个模块,这也可以工作,但我认为您正在为 ODR 违规设置自己。非常注重保留公共(public)数据 POD。

关于c++ - 模块间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com