C ++ статическая переменная и несколько процессов - PullRequest
3 голосов
/ 03 марта 2012

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

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

2 голосов
/ 04 марта 2012

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

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

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

...