我想知道如何在不同的程序模块之间共享一些内存 - 比方说,我有一个主应用程序(exe),然后是一些模块(dll).它们都链接到同一个静态库.这个静态库将有一些管理器,它提供各种服务.我想要实现的是在所有应用程序模块之间共享此管理器,并在库初始化期间透明地执行此操作.在进程之间我可以使用共享内存,但我希望这只在当前进程中共享.你能想到一些跨平台的方式吗?可能使用boost库,如果它们提供了一些设施来执行此操作.
我现在只能想到的解决方案是使用相应操作系统的共享库,所有其他模块将在运行时链接到该库,并将管理器保存在那里.
编辑:澄清我实际需要的东西:
Ben*_*igt 11
我认为您需要来自共享库的帮助才能以任何便携方式执行此操作.它不一定需要了解模块之间共享的对象,它只需要提供一些从键(可能是字符串)到指针的全局可访问映射.
但是,如果您愿意调用OS API,这是可行的,我认为您可能只需要两个特定于操作系统的部分的实现(一个用于Windows DLL和GetProcAddress,一个用于使用dlopen的操作系统).
当每个模块加载时,它会遍历先前加载的模块列表,查找导出特殊命名函数的任何模块.如果找到一个(任何,无关紧要,因为不变量是所有完全加载的模块都知道公共对象),它从先前加载的模块获取公共对象的地址,然后递增引用计数.如果它找不到任何内容,它会分配新数据并初始化引用计数.在模块卸载期间,它会减少引用计数,并在引用计数达到零时释放公共对象.
当然,有必要将OS分配器用于公共对象,因为虽然不太可能,但它可能从与首次加载它的库不同的库中解除分配.这也意味着公共对象不能包含任何虚拟函数或指向不同模块的段的任何其他类型的指针.其所有资源必须通过OS进程范围的分配器动态分配.对于libc ++是共享库的系统来说,这可能不是一个负担,但是你说你是静态链接CRT.
在Win32中需要的功能将包括EnumProcessModules,GetProcAddress,HeapAlloc,和HeapFree,GetProcessHeap和GetCurrentProcess.
考虑到所有事情,我想我会坚持将公共对象放在自己的共享库中,该库利用加载器的数据结构来查找它.否则你将重新发明装载机.即使将CRT静态链接到多个模块中,这也会起作用,但我认为您正在为ODR违规做好准备.保持公共数据POD真的很特别.
| 归档时间: |
|
| 查看次数: |
14716 次 |
| 最近记录: |