在Linux x86_64上使用单例C ++进行多处理

对于下面的问题,我正在寻找一个基于“纯粹的”C / C ++基础的答案,所以我将不胜感激一个非Boost的答案。 谢谢。

我有一个应用程序(例如电信基础设施服务器),它将在Linux环境(一个用于日志logging,一个用于定时器pipe理,一个用于协议消息传递,一个用于消息处理等)时产生几个进程。 它在Gentoo的x86_64环境中。 事情是,我需要一个单身人士可以从所有的进程访问。

这与在Linux上使用say,POSIX线程的multithreading不同,因为所有POSIX线程使用相同的地址空间,但是使用由fork()函数调用生成的多个进程时,情况并非如此。 当使用相同的地址空间时,单例就是所有线程中的相同地址,并且问题得到了平凡的解决(使用众所周知的保护,这对于所有人来说都是旧帽子)。 我喜欢通过fork()生成的多个进程提供给我的保护。

回到我的问题,我觉得正确的方法是在共享内存中创build单例,然后将共享内存的句柄传递给调用任务。

我想象下面的(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. eg, in the following SomeGiantObject* obj; obj should also be in shared memory. */ }; 

getInstance()方法返回SomeSingleton对象的共享内存位置。

我的问题如下:

  1. 这是处理这个问题的合法方式吗? SO上的人怎么处理这个问题呢?
  2. 为了使上面的代码能够工作,我设想了一个全局声明(静态的定义),指向类声明之前的共享内存。
  3. 最后,我知道在Linux上,创build线程和进程的开销是“相对相似的”,但是我想知道为什么没有太多的关于SO的多处理讨论(gob负载多虽然!)。 这里甚至没有标签! 多重处理(使用fork())在C ++编码社区中脱颖而出? 任何有关的意见也是赞赏。 另外,我可以请求声誉大于1500的人创build一个“multi-processing”标签吗? 谢谢。

如果在分叉之前创建共享内存区域,则它将映射到所有对等体中的相同地址。

您也可以使用自定义分配器将共享区域中包含的对象也放置在共享区域内。 这应该也可以在分叉之前完成,但是要注意重复析构函数的调用(例如flush缓冲区的析构函数是好的,但是任何导致对象不可用的东西都应该被跳过,只是泄漏并让操作系统在所有进程之后回收内存关闭共享内存句柄)。