C ++静态变量和多个进程

时间:2012-03-03 11:08:34

标签: c++ static initialization

我有一个C ++程序,可以让子进程执行一些工作。在这些子进程中,创建了一些类,并且在成员函数中有一个静态变量,如下所示:

void MyClass::foo () {
    static std::string uuid;
    ...
    uuid = "A new value";
}

由于每个进程都是新分叉的,我假设uuid始终被初始化为空字符串。但是,在某些情况下,我注意到uuid已经在函数的第一次输入时被赋予了值,这会导致问题。

如何在分叉进程中初始化此静态变量?并且我是使用类变量的唯一选择吗?静态变量的原因是我不想引入只在单个函数中使用的类变量,以保持类的整洁。

2 个答案:

答案 0 :(得分:3)

我发现在极少数情况下,MyClass也会在父进程中实例化。之后,分叉进程继承静态变量,该变量已使用父进程中的值进行初始化。

答案 1 :(得分:2)

当第一个进程启动时,二进制可执行文件将映射到内存中,其不同的部分都会在内存中终止(.bss,.text等)。由于数据部分映射到内存中,因此静态变量指向映射的.data部分的偏移量。

现在当一个进程分叉时,创建的进程被授予自己的虚拟内存空间,这是其父进程的完美副本(在分叉时)。 “uuid”指向自己的记忆区。

旁注:内核允许孩子们的虚拟页面映射到与父母相同的物理页面,只要他们不是两个进程都不会修改它们。