對於以下問題單身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對象返回的共享存儲器位置。
我的問題如下:
- 這是處理問題的一個合法的方式? SO上的人們怎麼處理這個問題呢?
- 對於上述代碼的工作,我設想一個全局聲明(按照定義靜態)作爲類聲明之前所示指向共享存儲器。
- 最後,但並非最不重要的,我知道在Linux上,創建線程與進程的開銷是「比較相似,」但我不知道爲什麼沒有太多的多處理討論的方式對SO(採空區儘管多線程的負載!)。這裏甚至沒有標籤!多重處理(使用fork())在C++編碼社區中脫穎而出?任何有關這方面的見解也表示讚賞。另外,我可以請求聲譽大於1500的人創建「多處理」標籤嗎?謝謝。
在標記轉換爲註釋之前,請注意,問題說如果「單身人士具有相同的地址...,問題可以簡單地解決」 – 2012-03-15 21:28:37
謝謝,本。我相信這就是我的意圖確實,但在我的問題中並不清楚。 – Sonny 2012-03-15 21:28:44