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

C++/Linux, share objects in memory between applications

本文关键字:内存 共享 对象 之间 应用程序 Linux c++      更新时间:2023-10-16

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

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

最新版本文档链接:http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess.html

这里也有很多例子。它应该让你对它的功能有一个很好的快速概述。

在c++中有没有一种方法来共享vector mydata;在两个应用程序?如果是这样,最好的实现是什么?我如果可能,最好避免使用第三方库。

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

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

如果你正在使用c++ 11,那么你可以完全用c++标准库std::thread来做。如果没有,那么您可能不得不使用POSIX线程库pthreads

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

不完全是这样,可以通过使用读写锁来允许多个读线程并行进行,但是当写线程开始修改共享对象时,所有的读线程必须暂停,否则会出现不一致和许多其他问题。