对于那些熟悉进程间通信的人,我有一个简单的问题。
场合
我认为更好的解决方案是创建一个"对象" - 上课并在程序之间共享对象存储器地址,从而在理论上"合并" A和B然后:
据我所知,这也存在一些问题,即如果对象被访问它的主要/另一个程序从内存位置删除。
问题
提前感谢您就此问题提出任何建议。
答案 0 :(得分:1)
Boost.Interprocess有多种方法可以在流程之间共享数据,其中一种方法是shared_memory
取自boost的示例,其中程序充当同一内存对象的服务器或客户端(取决于是否给出参数)
include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <cstring>
#include <cstdlib>
#include <string>
int main(int argc, char *argv[])
{
using namespace boost::interprocess;
if(argc == 1){ //Parent process
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create a shared memory object.
shared_memory_object shm (create_only, "MySharedMemory", read_write);
//Set size
shm.truncate(1000);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
//Write all the memory to 1
std::memset(region.get_address(), 1, region.get_size());
//Launch child process
std::string s(argv[0]); s += " child ";
if(0 != std::system(s.c_str()))
return 1;
}
else{
//Open already created shared memory object.
shared_memory_object shm (open_only, "MySharedMemory", read_only);
//Map the whole shared memory in this process
mapped_region region(shm, read_only);
//Check that memory was initialized to 1
char *mem = static_cast<char*>(region.get_address());
for(std::size_t i = 0; i < region.get_size(); ++i)
if(*mem++ != 1)
return 1; //Error checking memory
}
return 0;
}
答案 1 :(得分:1)
简化!
一般来说,shared state可能是一个坏主意,不会很好地测试,并且可能会像global variables那样造成无法管理的严重架构的破坏。
ØMQ guide可能会帮助您掌握可能的解决方案。通常,如果您没有特殊要求,请使用消息传递。 ØMQ“套接字”速度快,非常健壮,只需很少的代码即可开始使用。
更新:readymade:msgpack-rpc或protobuf-remote
答案 2 :(得分:0)
您是为客户制作软件,还是仅为自己进行数据分析?如果只是为了您自己,您可以将数据写入硬盘,并将分析分为两个步骤。