11

我在 C++ 中有一个相对复杂的类。在一个流程中使用时,它可以完美运行。但是,现在我希望多个进程能够共享此类的一个对象实例。一个进程(Master)将访问对象的读取和写入功能,而其他 2 个进程(Slave)将只使用读取功能。我想尽可能少地修改课程。到目前为止,我已经考虑过单例和共享内存,但看起来都不是理想的或简单的。这是一个研究应用程序,只能由我在 Linux 上使用。什么是最简单的可能解决方案?

非常感谢!

编辑:绝对清楚,提问者对跨多个进程不是线程共享对象感兴趣。

4

5 回答 5

4

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

我不能给你任何好的建议,因为我从来没有找到一个让它变得简单的库,我也没有太多的经验。

于 2013-05-30T20:28:22.997 回答
1

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

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

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

于 2013-05-30T20:24:36.007 回答
1

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

您可以在此处找到 ØMQ 的一个小示例。

于 2013-05-30T20:46:16.503 回答
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);

  }

}

这是接收这些更改并更新其“共享”对象的从属代码;很可能在另一个线程中运行,因此从站可以运行而无需停止并检查对象更新。

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);

}
于 2013-05-30T21:05:32.383 回答
1

请参阅 Boost Interprocess 中的“共享内存”:http: //www.boost.org/doc/libs/1_63_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

于 2017-09-11T16:22:23.220 回答