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

时间:2013-05-30 20:15:53

标签: c++ object share

我在c ++中有一个相对复杂的类。它在一个过程中使用时效果很好。但是,现在我希望多个进程能够共享此类的一个对象实例。一个进程(Master)将访问对象的读写函数,而另外两个进程(Slave)将仅使用read函数。我想尽可能少地修改类。到目前为止,我已经考虑过单身人士和共享记忆,但似乎既不理想也不直截了当。这是一个只会由我在Linux上使用的研究应用程序。什么是最简单的解决方案?

非常感谢!

编辑:要绝对清楚,提问者有兴趣在多个进程而非线程中共享对象。

5 个答案:

答案 0 :(得分:3)

进程间通信从不简单。您可能希望使用IPC / RPC库,并且只公开从属用于读取数据的函数,而不是整个类。

我不能给你任何好的建议,因为我从来没有找到一个简单的图书馆,而且我没有多少经验。

答案 1 :(得分:1)

我认为最简单的编码解决方案是具有全局(或类实例)互斥体的单例,尽管其单例部分是可选的。我个人认为单身人士是一个过度使用的成语。在这种情况下你是否认为这是好的设计取决于你。真的,添加全局互斥锁就是您所需要的。

对于进程间部分,我建议使用boost。

http://www.boost.org/doc/libs/1_36_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.semaphores.semaphores_interprocess_semaphores

答案 2 :(得分:1)

一个想法可能是使用套接字或套接字库在进程之间共享数据。一个看起来非常方便的库可能是ØMQ。您也可以尝试使用更复杂的Boost::Asio

您可以找到ØMQhere的一个小例子。

答案 3 :(得分:1)

一种选择是让主进程和从进程都创建同一对象的实例。由于主进程将是唯一一个修改此“共享”对象的进程,因此它必须仅向从属进程发出警报,以对其对“共享”对象所做的任何更改。为此,您可以设置一个消息传递系统,主进程将使用该消息传递系统将对共享对象的更改与从属进程进行通信。这里的缺点是从属进程可能在与主服务器不同步时引用共享对象,但这是复制中的常见问题。此外,您可以使用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);

}

答案 4 :(得分:1)