2012-03-15 61 views
2

對於以下問題單身C++,我找的是基於「純粹」的C/C++基礎的答案,所以我將不勝感激非升壓答案。謝謝。多處理在Linux x86_64的

我有一個應用程序(例如,電信基礎設施服務器),它將在啓動時在Linux環境中產生多個進程(一個用於日誌記錄,一個用於定時器管理,一個用於協議消息傳遞,一個用於消息處理等) )。它位於Gentoo上的x86_64環境中。事情是,我需要一個單身人士可以從所有進程訪問。

這與Linux上使用say,POSIX線程的多線程不同,因爲所有POSIX線程都使用相同的地址空間,但fork()函數調用生成的多個進程的情況並非如此用過的。當使用相同的地址空間時,單例在所有線程中都是相同的地址,並且問題得到了平凡的解決(使用衆所周知的保護,這對所有人來說都是舊帽子)。我喜歡通過fork()生成的多個進程提供給我的保護。

讓我們回到我的問題,我覺得接近,這將是建立在共享內存的單,然後句柄傳遞到共享內存到調用任務的正確方法。

我想象以下(SomeSingleton.h):

#include <unistd.h> 
#... <usual includes> 
#include "SomeGiantObject.h" 

int size = 8192; // Enough to contain the SomeSingleton object 
int shm_fd = shm_open ("/some_singleton_shm", O_CREAT | O_EXCL | O_RDWR, 0666); 
ftruncate (shm_fd, size); 
sharedMemoryLocationForSomeSingleton = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); 

class SomeSingleton 
{ 
    public: 
    SomeSingleton* getInstance() 
    { 
     return reinterpret_cast<SomeSingleton*>sharedMemoryLocationForSomeSingleton; 
    } 
    private: 
    SomeSingleton(); 
    /* 
     Whole bunch of attributes that is shared across processes. 
     These attributes also should be in shared memory. 
     e.g., in the following 
     SomeGiantObject* obj; 
     obj should also be in shared memory. 
    */ 
}; 

的getInstance()方法用於SomeSingleton對象返回的共享存儲器位置。

我的問題如下:

  1. 這是處理問題的一個合法的方式? SO上的人們怎麼處理這個問題呢?
  2. 對於上述代碼的工作,我設想一個全局聲明(按照定義靜態)作爲類聲明之前所示指向共享存儲器。
  3. 最後,但並非最不重要的,我知道在Linux上,創建線程與進程的開銷是「比較相似,」但我不知道爲什麼沒有太多的多處理討論的方式對SO(採空區儘管多線程的負載!)。這裏甚至沒有標籤!多重處理(使用fork())在C++編碼社區中脫穎而出?任何有關這方面的見解也表示讚賞。另外,我可以請求聲譽大於1500的人創建「多處理」標籤嗎?謝謝。

回答

1

如果在分叉前創建共享內存區域,那麼它將被映射到所有對等體中的相同地址。

您可以使用自定義分配器放置包含的對象共享區域內也。這也許應該分叉以及之前完成,但要小心,析構函數調用(即如刷新緩衝區細析構函數的重複,但任何讓物體無法使用應該被跳過,只是泄漏,讓操作系統的所有進程後回收內存關閉共享內存句柄)。

+0

在標記轉換爲註釋之前,請注意,問題說如果「單身人士具有相同的地址...,問題可以簡單地解決」 – 2012-03-15 21:28:37

+0

謝謝,本。我相信這就是我的意圖確實,但在我的問題中並不清楚。 – Sonny 2012-03-15 21:28:44