c++;在多个进程之间共享单个类对象 我在C++中有一个比较复杂的类。当在一个过程中使用时,它可以完美地工作。但是,现在我希望多个进程能够共享这个类的一个对象实例。一个进程(主进程)将访问对象的读写功能,而其他两个进程(从进程)将仅使用读功能。我希望尽可能少地修改这个类。到目前为止,我已经考虑过单身和共享内存,但两者都不理想也不简单。这是一个只有我在Linux上才会使用的研究应用程序。最简单的解决方案是什么

c++;在多个进程之间共享单个类对象 我在C++中有一个比较复杂的类。当在一个过程中使用时,它可以完美地工作。但是,现在我希望多个进程能够共享这个类的一个对象实例。一个进程(主进程)将访问对象的读写功能,而其他两个进程(从进程)将仅使用读功能。我希望尽可能少地修改这个类。到目前为止,我已经考虑过单身和共享内存,但两者都不理想也不简单。这是一个只有我在Linux上才会使用的研究应用程序。最简单的解决方案是什么,c++,object,share,C++,Object,Share,非常感谢 编辑:非常清楚地说,询问者感兴趣的是跨多个进程而不是线程共享对象。我认为最简单的编码解决方案是带有全局(或类实例)互斥体的单例,尽管其中的单例部分是可选的。我个人认为单身是一个被滥用的习语。在这种情况下,你是否认为这是一个好的设计取决于你。实际上,添加全局互斥体就是您所需要的 对于进程间部分,我建议使用boost 进程间通信从来都不是简单的。您可能希望为IPC/RPC使用一个库,并且只公开从机用于读取数据的函数,而不是整个类 我不能给你任何好的建议,因为我从来没有找到一个简单的库,我也

非常感谢


编辑:非常清楚地说,询问者感兴趣的是跨多个进程而不是线程共享对象。

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

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


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


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

一个想法可能是使用套接字或套接字库在进程之间共享数据。一个似乎非常方便的图书馆可能是。您还可以尝试使用更复杂一点的


您可以找到Ø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中的“共享内存”:

我没有使用过它,但您没有提到知道。您可能需要搜索
共享内存。但是对于
C
(可能也适用于C++)切换到Delphi并使用BPLs(类固醇上的某种dll):)我最近有幸处理了一个类似的问题。让我分享我新发现的智慧。数据共享部分是最简单的部分。真正的问题在于您的多个流程。这取决于这些进程将如何运行。这才是真正的问题。处理将作为线程或单个进程运行。如果它们将作为单独的进程运行,那么您需要考虑内存共享,因为各个进程不能访问相同的内存。如果多处理是使用线程完成的,那么解决方案就相当简单,正如其他人所建议的那样。在这两种情况下都不需要像Boost库那样复杂。该解决方案甚至比ØMQ更简单。