我在 C++ 中有一个相对复杂的类。在一个流程中使用时,它可以完美运行。但是,现在我希望多个进程能够共享此类的一个对象实例。一个进程(Master)将访问对象的读取和写入功能,而其他 2 个进程(Slave)将只使用读取功能。我想尽可能少地修改课程。到目前为止,我已经考虑过单例和共享内存,但看起来都不是理想的或简单的。这是一个研究应用程序,只能由我在 Linux 上使用。什么是最简单的可能解决方案?
非常感谢!
编辑:绝对清楚,提问者对跨多个进程而不是线程共享对象感兴趣。
进程间通信从来都不是简单的。您可能希望使用 IPC/RPC 库并仅公开从站用于读取数据的函数,而不是整个类。
我不能给你任何好的建议,因为我从来没有找到一个让它变得简单的库,我也没有太多的经验。
我认为最简单的编码解决方案是具有全局(或类实例)互斥锁的单例,尽管其中的单例部分是可选的。我个人认为单例是一个被过度使用的成语。在这种情况下,您是否认为这是好的设计取决于您。确实,您只需要添加全局互斥锁即可。
对于进程间部分,我建议使用 boost。
一种想法可能是使用套接字或套接字库在进程之间共享数据。一个似乎非常方便的库可能是ØMQ。您也可以尝试使用更复杂的Boost::Asio 。
您可以在此处找到 ØMQ 的一个小示例。
一种选择是让主进程和从进程都创建同一对象的实例。因为主进程将是唯一修改这个“共享”对象的进程,所以它必须只提醒从属进程它对“共享”对象所做的任何更改。为此,您可以设置一个消息传递系统,主进程将使用该系统将更改与从属进程通信到共享对象。这里的缺点是从进程可能会在与主进程不同步时引用共享对象,但这是复制中的常见问题。此外,您可以使用 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);
}
}
这是接收这些更改并更新其“共享”对象的从属代码;很可能在另一个线程中运行,因此从站可以运行而无需停止并检查对象更新。
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