c++在多个进程之间共享单个类对象
c++ sharing single class object between multiple processes
我在c++中有一个相对复杂的类。当在一个过程中使用时,它可以完美地工作。但是,现在我希望多个进程能够共享该类的一个对象实例。一个进程(Master)将访问对象的读和写函数,而另外两个进程(Slave)将只使用对象的读函数。我想尽可能少地修改这个类。到目前为止,我已经考虑了单例模式和共享内存,但两者似乎都不理想,也不直接。这是一个研究应用程序,只会被我在Linux上使用。最简单的解决方案是什么?
非常感谢!
编辑:需要明确的是,请求者对跨多个进程而不是线程共享对象感兴趣。进程间通信从来不是简单的。您可能希望为IPC/RPC使用一个库,并且只公开从服务器用于读取数据的函数,而不是整个类。
我不能给你任何好的建议,因为我从来没有发现一个库使它变得简单,我也没有太多的经验。
一个想法可能是使用套接字或套接字库在进程之间共享数据。一个看起来非常方便的库可能是ØMQ。你也可以尝试使用Boost::Asio,这有点复杂。
您可以在这里找到ØMQ的小示例
我认为最简单的编码解决方案是具有全局(或类实例)互斥锁的单例,尽管其中的单例部分是可选的。我个人认为singleton是一个被过度使用的习语。在这种情况下,你是否认为这是一个好的设计取决于你。实际上,添加全局互斥锁就是您所需要的。
对于进程间部分,我建议使用boost。
http://www.boost.org/doc/libs/1_36_0/doc/html/interprocess/synchronization_mechanisms.html interprocess.synchronization_mechanisms.semaphores.semaphores_interprocess_semaphores
一种选择是让主进程和从进程都创建同一个对象的实例。因为主进程将是唯一修改这个"共享"对象的进程,所以它必须只通知从进程它对"共享"对象所做的任何更改。为此,您可以设置一个消息传递系统,主进程将使用该系统与从进程通信对共享对象的更改。这里的缺点是,当共享对象与主进程不同步时,从进程可能会引用它,但这是复制中的一个常见问题。另外,您可以使用RPC覆盖进一步使主/从应用程序更易于开发/维护。
我将在下面提供一个非常高级的这种设计的例子。请原谅我并排使用真实代码和伪代码;我不想完全编码,但也不希望它只是由注释组成:)这是我们在主/从代码中定义的共享对象
struct sharedobj {
int var1;
};
下面是主进程更新共享对象和传播更改的示例
int counter = 0;
sharedobj mysharedobj;
while(true){
//update the local version first
mysharedobj.var1 = counter++;
//then call some function to push these changes to the slaves
updateSharedObj(mysharedobj);
}
这是将主服务器的更改传播到从服务器的函数;
updatedSharedObj(sharedobj obj){
//set up some sort of message that encompasses these changes
string msg = "var1:" + the string value of obj.var1;
//go through the set of slave processes
//if we've just done basic messaging, maybe we have a socket open for each process
while(socketit != socketlist.end()){
//send message to slave
send(*socketit, msg.c_str(),msg.length(),0);
}
}
下面是接收这些更改并更新其"共享"对象的从属代码;很可能在另一个线程中运行,所以slave可以运行而不必停止并检查对象更新。
while(true){
//wait on the socket for updates
read(mysock,msgbuf,msgbufsize,0);
//parse the msgbuf
int newv1 = the int value of var1 from the msg;
//if we're in another thread we need to synchronize access to the object between
//update thread and slave
pthread_mutex_lock(&objlock);
//update the value of var1
sharedobj.var1 = newv1;
//and release the lock
pthread_mutex_unlock(&objlock);
}
参见Boost Interprocess中的"共享内存":http://www.boost.org/doc/libs/1_63_0/doc/html/interprocess/sharedmemorybetweenprocesses.html
- 如何限制在C++中为单个类创建的对象数量?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 模板化虚拟函数,管理单个类的不同类属性
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- ASAN 检测与动态加载库共享的类的 vtable 的 ODR 违规
- 在实例副本之间共享的类成员
- C++ 使用宏定义单个类的类成员
- __ getItem__对于单个类的多个属性
- 共享接口类和 C++ 派生类中的默认参数值
- C++继承,是否可以只有共享祖父类的 1 个副本
- 使用std::Shared_ptr的共享数据类
- C++让两个子类共享基类中的一个变量
- 如何使用共享基类重载派生类的运算符<<?
- 如何在组件之间共享公共类和非公共函数
- GCC C++覆盖单个类的-frtti
- SRP 是否与单个类的可能操作或其在其中的实现相关
- C++/提升共享资源类,用于管理资源生命周期,如shared_ptr
- 线程是否共享一些类字段
- c++在多个进程之间共享单个类对象
- 如何在两个类之间共享单个临界区