0

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

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

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

我要分享的数据是

vector< vector<struct> > mydata;

我希望其他应用程序能够执行类似的操作

mydata.at(ii).back()

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

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

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

4

2 回答 2

6

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

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

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

于 2013-04-03T16:15:22.810 回答
1

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

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

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

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

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

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

于 2013-04-03T16:17:06.937 回答