我想知道如何在不同的程序模块之间共享一些内存 - 比方说,我有一个主应用程序(exe),然后是一些模块(dll)。它们都链接到同一个静态库。这个静态库将有一些管理器,它提供各种服务。我想要实现的是在所有应用程序模块之间共享此管理器,并在库初始化期间透明地执行此操作。 在进程之间我可以使用共享内存,但我希望它只在当前进程中共享。 你能想到一些跨平台的方式吗?可能使用boost库,如果它们提供了一些设施来执行此操作。
我现在只能想到的解决方案是使用相应操作系统的共享库,所有其他模块将在运行时链接到该库,并将管理器保存在那里。
编辑: 澄清我实际需要的东西:
答案 0 :(得分:11)
答案 1 :(得分:1)
仅用于当前流程,您无需设计任何特殊功能或结构。
即使没有任何功能,您也可以这样做,但是更安全且跨平台友好来定义提供对共享数据的访问的功能集。这些功能可以通过公共静态库来实现。
我认为,只关注这种设置是:“谁将拥有数据?”。必须存在共享数据的唯一所有者。
有了这些基本想法,我们可以像这样简化API:
IsSharedDataExist // check whether of not shared data exist
CreateSharedData // create (possibly dynamically) shared data
DestroySharedData // destroy shared data
... various data access API ...
或者使用Singleton模式的C ++类是合适的。
<强>更新强>
我很困惑。真正的问题可以定义为“如何在静态库中实现Singleton类,该库将与平台无关的方式与多个动态加载库链接(将在同一个过程中使用)”。
我认为,基本的想法并没有太大的不同,但要确保单身是真正的单一是这种设置的附加问题。
为此,您可以使用Boost.Interprocess。
#include <boost/config.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
...
boost::interprocess::named_mutex* singleton_check = 0;
// in the Create function of the singleton
try {
singleton_check = new boost::interprocess::named_mutex(boost::interprocess::create_only, "name_of_the_mutex" );
// if no exception throw, this is the first time execution
}
catch (...)
{
}
释放named_mutex就像delete singleton_check
一样简单。
<强>更新#2 强>
另一个建议。
我认为,我们不应该将共享数据放在公共静态库中。如果我们无法确保全球唯一的数据,那么不仅是棘手的平台相关实施问题,而且浪费内存和全球资源。
如果您更喜欢静态库实现,则应该创建两个静态库。一个用于共享数据的服务器/创建者,一个用于该共享数据的用户。服务器库定义并提供对Singleton的访问。客户端库提供各种数据访问方法。
这与没有静态库的Singleton实现完全相同。
答案 2 :(得分:0)
您可以使用boost::interprocess
http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess.html
在Windows上,您可以在DLL中创建一个共享段,该段将由使用#pragma的所有进程共享:http://www.codeproject.com/KB/DLL/data_seg_share.aspx
答案 3 :(得分:0)
根据MSDN我看到只有两种方法可以在模块之间共享数据
正如有人指出,共享段仅适用于同一个dll的两个实例,因此我们只剩下一个选择来使用内存映射文件技术。