2013-05-30 141 views
8

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

非常感谢!

编辑:必须绝对清楚,提问者有兴趣在多个共享对象过程线程。

+1

我还没有使用它,但你不提意识到的[Boost.Interprocess中(HTTP://www.boost。组织/ DOC /库/ 1_53_0/DOC/HTML/interprocess.html)。 – BoBTFish

+0

您可能想要搜索“共享内存”。 [这是一个关于这个问题](http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c)但是'C'(女巫也可能适用于C++ ) – A4L

回答

1

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

您可以找到一个适用于ØMQhere的小示例。

0

我认为最简单的编码解决方案是一个带有全局(或类实例)互斥锁的单例,尽管它的单例部分是可选的。我个人认为单身人士是一个过度使用的习惯用法。在这种情况下,你认为这是不错的设计。真的,添加全局互斥是你所需要的。

对于进程间部分,我建议增加。

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

3

进程间通信是决不简单。您可能希望为IPC/RPC使用库,并仅公开从服务器用于读取数据的功能,而不是整个班级。

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

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

}