在共享内存C ++中实例化对象

时间:2009-12-23 15:18:52

标签: c++ memory-management shared-memory

我们需要多个程序来调用公共库中的函数。库函数访问和更新公共全局内存。每个程序的函数调用都需要查看这个常见的全局内存。即使从另一个程序调用,这是一个函数调用需要查看任何先前函数调用的更新。 出于兼容性原因,我们对共享库公开的函数必须如何运行有几个设计约束:

  • 无论代码运行的线程如何,所有调用者都必须可以看到全局声明的任何数据项(包括标准数据类型和对象)。
  • 在函数中本地声明的任何数据项仅在该函数内可见。
  • 任何标准数据类型或任何类的实例都可以在本地或全局或两者中出现。

一种解决方案是将库的公共全局内存放在命名共享内存中。第一个库调用将创建命名共享内存并初始化它。后续程序调用将获取共享内存的地址,并将其用作指向全局数据结构的指针。全局声明的对象实例需要在共享内存中动态分配,而本地声明的对象实例可以放在堆栈或调用程序线程的本地堆中。出现问题是因为全局内存中的初始化对象可以创建并指向分配(新)附加内存的子对象。这些新分配还需要位于共享内存中,并且所有库调用者都可以看到。另一个复杂因素是这些对象,它们包含字符串,文件等,也可以在调用程序中使用。在调用程序中声明时,对象的内存对于调用程序是本地的,而不是共享的。所以对象的代码需要处理任何一种情况。 在我们看来,解决方案将要求我们覆盖全局布局新的常规new和delete运算符。我们发现了一个内存管理系统的设计,它看起来会起作用,但我们还没有找到任何实际的实现。如果有人知道Nathan Myers的内存管理设计(http://www.cantrip.org/wave12.html?seenIEPage=1)的实现,我将非常感谢它的链接。或者,如果有人知道另一个可以动态分配对象的共享内存管理器,我也很想知道它。我已经检查过Boost库以及我能找到的所有其他来源,但似乎没有任何东西可以做我们需要的东西。我们不想自己写一个。由于性能和稳健性很重要,因此使用经过验证的代码会很不错。提前感谢任何想法/帮助。

感谢有关ATL和OSSP库的建议。我现在正在检查它们,虽然如果目标变成Unix,我担心ATL太过Wincentric。

另一件事我们现在似乎很清楚。由于可以在执行期间动态创建对象,因此内存管理方案必须能够分配额外的共享内存页面。现在,它开始看起来像一个完整的堆替换内存管理器。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

OSSP mm - 共享内存分配:

男子3毫米

答案 2 :(得分:0)

我确信你已经发现,这是一个非常复杂的问题,而且很难正确实施。从我的经历中得到一些提示。首先,您肯定希望使用信号量同步对共享内存分配的访问。其次,多个进程对共享对象的任何修改也需要由信号量保护。最后,在定义对象和数据结构时,需要考虑共享内存区域起点的偏移而不是绝对指针值(通常可以将内存映射到每个附加进程中的不同地址) ,虽然你可以选择一个固定的映射地址,如果你需要)。以强有力的方式将所有这些放在一起是困难的部分。如果进程意外死亡,基于共享内存的数据结构很容易被破坏,因此通常需要一些清理/恢复机制。

答案 3 :(得分:0)

还要研究互斥锁和信号量。当两个或多个实体需要共享内存或数据时,需要有一个“流量信号”机制来限制只有一个用户的写访问权。