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

标签 c++ memory-management shared-memory

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

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

一种解决方案是将库的公共(public)全局内存放在命名共享内存中。第一个库调用将创建命名的共享内存并对其进行初始化。随后的程序调用将获取共享内存的地址并将其用作指向全局数据结构的指针。全局声明的对象实例需要在共享内存中动态分配,而本地声明的对象实例可以放置在调用线程的堆栈或本地堆中。出现问题是因为全局内存中的初始化对象可以创建并指向分配(新)额外内存的子对象。这些新的分配也需要在共享内存中,并被所有库调用者看到。另一个复杂的问题是这些包含字符串、文件等的对象也可以在调用程序中使用。当在调用程序中声明时,对象的内存对于调用程序是本地的,而不是共享的。所以对象的代码需要处理这两种情况。 在我们看来,解决方案将要求我们覆盖全局放置新的、常规的新的和删除运算符。我们找到了一个看起来可行的内存管理系统设计,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计 (http://www.cantrip.org/wave12.html?seenIEPage=1) 的实现,我将不胜感激。或者,如果有人知道另一个可以动态分配对象的共享内存管理器,我也很想知道。我已经检查了 Boost 库和我能找到的所有其他资源,但似乎没有任何东西可以满足我们的需要。我们宁愿不必自己写一个。由于性能和健壮性很重要,因此最好使用经过验证的代码。在此先感谢您的任何想法/帮助。

感谢您对 ATL 和 OSSP 库的建议。我现在正在检查它们,但如果目标结果是 Unix,我担心 ATL 过于 Wincentric。

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

最佳答案

关于c++ - 在共享内存 C++ 中实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1953381/

相关文章:

c++ - 通过检查其返回值作为 -32767 和 0x8000 来使用 GetAsyncKeyState() 有什么区别?

c++ - 从 C++ 程序向 Rails 服务器发送数据的最佳方式

c++ - 循环文件包含 C++

c++ - 有没有一种方法可以在不修改基类的情况下防止派生类中的内存泄漏?

c++ - 如何尝试读取未分配的内存

c - 使用共享内存将 2 个 2D 数组相乘

c++ - makefile 发布多个定义

Java JNA 包装器和内存消耗

c - OpenCl共享虚拟内存测试奇怪的结果

c++ - Windows 10 是否会防止您访问其他程序正在使用的内存?