C++/Linux,在应用程序之间共享内存中的对象

标签 c++ vector shared-memory

我有一个生成大量数据的应用程序,我希望它可供另一个 C++ 应用程序访问。平台是 RHEL5,g++ 如果重要的话。

以前,我这样做的方法是将数据写出到/dev/shm(基本上是一个 linux 内存驱动器),然后让其他应用程序从那里读取它。

但是,这看起来效率很低,因为有一个 ofstream,然后是一个 ifstream,然后将数据重新加载到内存中。此外,将数据作为文本文件存储在内存中似乎比仅将其作为内存占用更多​​空间(尽管我不是 100% 确定这是真的)。​​

我要分享的数据是

的形式
vector< vector<struct> > mydata;

我希望其他应用程序能够做类似的事情

mydata.at(ii).back()

检索它需要的数据。 mydata 中实际上会有相当多的数据。如果我将它打印成 CSV 格式文件,它可能是 10GB。我正在使用的服务器有 24GB 的内存,应该足以处理这个问题。

此外,这种检索将在第一个应用程序向 mydata 添加更多条目时发生(因此可能存在潜在的竞争条件?)。

C++有没有办法共享vector mydata;两个应用程序之间?如果是这样,最好的实现是什么?如果可能,我宁愿避免使用第三方库。

最佳答案

您可能更喜欢避免使用第 3 方库,但最好的快速解决方案就在那里。试用 Boost.Interprocess。它提供了共享内存安全的容器(如 vector)以及易于使用的接口(interface)。它也是仅包含 header 的库之一,这使得它比其他一些库更容易集成。

有关最新版本的文档,请参阅此处的链接:http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess.html

那里也有很多例子。它应该能让您快速了解它的功能。

关于C++/Linux,在应用程序之间共享内存中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15792366/

相关文章:

r - 如何根据列表的长度拆分字符向量

C++ 新的 std::vector of pointers

c++在 vector 末尾插入元素

ios - SKSpriteNode 使用 PDF/SVG 矢量图像进行自动缩放

ruby - Ruby 2.2 中的垃圾收集器引发意想不到的 CoW

c - 如何共享现有内存?

c++ - 自由函数中的类型转换

c++ - std::unique_ptr 转移 const 对象的所有权

c++ - 我应该使用一类函数还是函数的命名空间?

c - 为延迟要求高的程序实现快照功能