gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:36:41 25 4
gpt4 key购买 nike

对于以下问题,我正在寻找基于“纯”C/C++ 基础知识的答案,因此我希望得到非 Boost 答案。谢谢。

我有一个应用程序(例如,一个电信基础设施服务器),它在启动时会在 Linux 环境中生成多个进程(一个用于日志记录,一个用于计时器管理,一个用于协议(protocol)消息传递,一个用于消息处理等。 ).它位于 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 的多处理讨论(gob负载多线程,虽然!)。这里连标签都没有!多重处理(使用 fork())是否在 C++ 编码社区中失宠?对此的任何见解也表示赞赏。另外,我可以要求声誉> 1500 的人创建标签“多处理”吗?谢谢。

最佳答案

如果您在 fork 之前创建共享内存区域,那么它将被映射到所有对等点的相同地址。

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

关于c++ - 在 Linux x86_64 上使用单例 C++ 进行多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com