对于以下问题单身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