2013-05-30 199 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); 

}