簡體   English   中英

在Linux x86_64上使用單例C ++進行多處理

[英]Multi-processing with singletons C++ on Linux x86_64

對於以下問題,我正在尋找基於“純” C / C ++基本原理的答案,因此,我希望您能獲得一個非Boost的答案。 謝謝。

我有一個應用程序(例如,電信基礎結構服務器),該應用程序在啟動時將在Linux環境上生成多個進程(一個用於日志記錄,一個用於計時器管理,一個用於協議消息傳遞,一個用於消息處理等)。 它位於Gentoo的x86_64環境中。 問題是,我需要一個單例才能從所有進程中進行訪問。

這與在Linux上使用POSIX線程的多線程不同,因為所有POSIX線程都使用相同的地址空間,但是當使用fork()函數調用生成的多個進程時,情況並非如此。 當使用相同的地址空間時,單例只是所有線程中的相同地址,並且問題可以輕松解決(使用眾所周知的保護,這對SO上的每個人都是舊帽子)。 我確實喜歡通過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上沒有太多的多處理討論方式( -threading!)。 這里甚至沒有標簽! 多處理(使用fork())是否在C ++編碼社區中不受歡迎? 任何對此的見解也將受到贊賞。 另外,我可以要求信譽> 1500的人創建標簽“多處理”嗎? 謝謝。

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

您也可以使用自定義分配器將包含的對象也放置在共享區域內。 這可能也應該在派生之前完成,但是要注意重復執行析構函數調用(析構函數,例如刷新緩沖區很好,但是應該跳過所有使對象不可用的事物,只是泄漏並讓OS在所有進程之后回收內存關閉共享內存句柄)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM