2012-03-03 2 views
3

У меня есть программа на C++, которая заставляет дочерние процессы выполнять некоторую работу. В этих дочерних процессов создаются некоторые классы и есть статическая переменная внутри функции-члена, как так:Статическая переменная C++ и несколько процессов

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

Поскольку каждый процесс свеже раздвоенный, я предположил, UUID всегда быть инициализированы как пустая строка. Однако в некоторых случаях я заметил, что uuid уже получил значение при первом входе функции, что вызывает проблемы.

Как эта статическая переменная может быть инициализирована для разветвленных процессов? И мой единственный вариант использования переменной класса? Причиной статической переменной является то, что я не хотел вводить переменные класса, которые используются только внутри одной функции, чтобы сохранить класс симпатичным и аккуратным.

+1

Проверить ответ [здесь] (http://stackoverflow.com/questions/4879294/c-static-variables-and-linux-fork) – Chikei

+0

MyClass не создается перед вилкой, но после этого ссылка не отвечает на мои вопрос. Я предположил, что статическая переменная всегда должна быть инициализирована пустой строкой, что не всегда так. Как это возможно? –

+0

Что вы подразумеваете под «fork»? Такого не существует в стандарте C++. Если вы имеете в виду какую-то другую платформу/библиотеку, вы должны это сказать. –

ответ

3

Я узнал, что MyClass также создается в родительском процессе в редких ситуациях. После этого разветвленные процессы наследуют статическую переменную, которая уже инициализирована значением в родительском процессе.

2

Когда первый процесс запущен, бинарный исполняемый файл отображается в памяти, а все его различные разделы заканчиваются в памяти (.bss, .text и т. Д.). Когда раздел данных отображается в памяти, ваша статическая переменная указывает на смещение отображаемого раздела .data.

Теперь, когда процесс вилки, созданному процессу присваивается собственное пространство виртуальной памяти, которое является идеальной копией его родителя (во время разветвления). «Uuid» указывает на свою собственную зону памяти.

Боковое примечание: ядро ​​позволяет виртуальным страницам детей сопоставляться с теми же физическими страницами, что и родители, так как они не являются ни одним из двух процессов, которые их модифицируют.

Смежные вопросы