【问题标题】:C++/Linux, share objects in memory between applicationsC++/Linux,在应用程序之间共享内存中的对象
【发布时间】:2013-04-03 16:04:27
【问题描述】:

我有一个生成大量数据的应用程序,我希望它可供另一个 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;两个应用程序之间?如果是这样,最好的实现是什么?如果可能,我宁愿避免使用第三方库。

【问题讨论】:

  • 你熟悉管道吗?
  • 它不处理任何同步,但您可以使用mmap 跨应用程序共享内存。您可以使用placement new 将向量放入mmap 提供的内存中,但似乎您可能必须编写自己的分配器才能将这些向量的所有元素保留在该内存块中。这种访问可能会比使用fstream 快得多,但魔鬼在细节中。
  • 嘿,你能分享一下你是如何使用boost库实现的吗?我也遇到了类似的问题

标签: c++ vector shared-memory


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    对于应用程序,如果您指的是进程,那么答案是否定的,数据结构不能在两个进程之间共享。为了在进程之间共享数据,必须使用共享内存(如您所确定的)。 (可以使用消息进行进程间通信,但您的用例可能不适合这样做。

    您会考虑使用线程吗?这样,您可以在两个执行线程之间共享mydata。您需要mutex 来同步对共享数据的访问。

    如果您使用的是 C++11,那么您可以完全使用 C++ 标准库 std::thread。如果没有,那么您可能必须使用 POSIX 线程库 pthreads

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

    不完全是,使用reader-writer locks是可以让多个读取线程并行进行的,但是当写入线程开始修改共享对象的时候,所有的读取线程都得推迟,否则会出现不一致和还有很多其他问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2011-12-15
      • 2018-06-04
      • 2013-05-02
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多