c++ /Linux,在应用程序之间共享内存中的对象
C++/Linux, share objects in memory between applications
我有一个生成相当多数据的应用程序,我希望它可用于另一个c++应用程序访问。平台是RHEL5, g++,如果需要的话。
以前,我这样做的方式是通过将数据写入/dev/shm(基本上是linux内存驱动器),然后让其他应用程序从那里读取它。
然而,这似乎相当低效,因为有一个ofstream,然后是ifstream,并将数据重新加载到内存中。此外,将数据作为文本文件存储在内存中似乎比将其作为内存保存要占用更多的空间(尽管我不能100%确定这是真的)。
我想分享的数据是
vector< vector<struct> > mydata;
我希望另一个应用程序能够做一些类似
的事情mydata.at(ii).back()
来检索所需的数据。实际上mydata中会有相当多的数据。如果我要把它打印成CSV格式的文件,它可能是10GB。我正在工作的服务器有24GB的内存,应该足以处理这个。
此外,当第一个应用程序向mydata中添加更多条目时,可能会发生这种检索(因此可能存在潜在的竞争条件?)
在c++中有没有一种方法来共享vector
您可能更喜欢避免使用第三方库,但是最好的快速解决方案就在那里。试试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中添加更多条目(因此可能存在潜在的竞争)条件?)。
不完全是这样,可以通过使用读写锁来允许多个读线程并行进行,但是当写线程开始修改共享对象时,所有的读线程必须暂停,否则会出现不一致和许多其他问题。
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- Directx 12 :在两个进程之间共享图形内存
- 有没有办法列出所有共享内存对象的名称?
- 子进程更新共享 mmap 内存,但父进程没有更改
- C++线程之间的内存共享
- 使用Windows共享内存共享小数据
- 更有效地使用fork()和写时复制内存共享
- 从托管代码到非托管代码跨共享内存共享整数数组
- 通过内存共享c++对象
- 内存共享;继承;基实例和派生实例;c++
- Matlab与c++在MEX中的内存共享
- 跨共享内存共享 std::字符串