在模块之间共享内存

时间:2011-01-06 14:49:15

标签: c++ memory module

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

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

编辑: 澄清我实际需要的东西:

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

4 个答案:

答案 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我看到只有两种方法可以在模块之间共享数据

  1. 使用data_seg pragma
  2. 使用共享内存。
  3. 正如有人指出,共享段仅适用于同一个dll的两个实例,因此我们只剩下一个选择来使用内存映射文件技术。