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

时间:2013-04-03 16:04:27

标签: 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 ++中有没有办法共享向量&lt;矢量&gt; MYDATA;两个申请之间?如果是这样,最好的实现是什么?如果可能的话,我宁愿避免使用第三方库。

2 个答案:

答案 0 :(得分:6)

您可能更喜欢以避免第三方库,但最好的快速解决方案就在那里。试试Boost.Interprocess。它提供共享内存安全容器(如矢量)以及易于使用的界面。它也是仅限标头的库之一,这使得它比其他一些库更容易集成。

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

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

答案 1 :(得分:1)

  

C ++中有没有办法共享向量&lt;矢量&gt; MYDATA;两个之间   应用程序?如果是这样,最好的实现是什么?一世   如果可能,我宁愿避免使用第三方图书馆。

通过应用程序,如果您的意思是进程,那么答案是否定的,数据结构不能在两个进程之间共享。要在进程之间共享数据,必须使用共享内存(如您所标识的那样)。 (可以使用消息进行进程间通信,但是您的用例可能不适合。

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

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

  

此外,这种检索将在第一个应用程序时发生   在mydata中添加更多条目(所以也许有潜在的竞争   条件是什么?)。

不完全是,可以通过使用reader-writer locks允许多个读取器线程并行进行,但是当编写器线程开始修改共享对象时,所有读取器线程都必须延迟,否则将会有不一致和许多其他问题。

相关问题