c++在多个进程之间共享单个类对象

c++ sharing single class object between multiple processes

本文关键字:共享 单个类 对象 之间 进程 c++      更新时间:2023-10-16

我在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