2012-03-15 67 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