Раздела 6.7 стандарта это сказать:
Нулевой инициализации всех локальных объектов со статической продолжительностью хранения выполняется перед любой другой инициализации происходит. Локальный объект объекта POD со статическим хранилищем длительность инициализируется с помощью константных выражений инициализируется до того, как его блок будет введен первым. реализация разрешается выполнять ранней инициализации других локальных объектов со статической продолжительностью хранения при тех же условиях, что реализация разрешено статически инициализировать объект с статической продолжительности хранения в пространстве имен области. В противном случае такой объект инициализирован первый контрольный элемент времени проходит через его декларацию; такой объект считается инициализированным после завершения его инициализации . Если инициализация завершается путем исключения исключения, инициализация не завершена, поэтому в следующий раз будет проверяться , когда вступает в действие управление . Если элемент управления повторно вводит объявление (рекурсивно), в то время как объект инициализируется , поведение undefined.
Так что, если это тип POD, то похоже, что инициализация происходит при запуске до того, как начнутся новые потоки. Для не-POD-типов это сложнее, стандарт говорит, что поведение не определено (если в другом месте ничего не говорится о безопасности потоков во время инициализации).
Я знаю, что при инициализации объекта, отличного от POD, GCC захватывает мьютекс, чтобы предотвратить его инициализацию дважды (я знаю это, потому что однажды я зашел в тупик программы, случайно рекурсивно инициализируя статический объект).
К сожалению, я не могу сказать, является ли это случаем для других компиляторов, или это предусмотрено в другом месте стандарта.
статический соп не вариант? –
constness не будет работать здесь, так как int будет модифицироваться позже (в то время как мьютекс, известный для существования). У меня было ощущение, что любой здравомыслящий компилятор будет по крайней мере нулевым инициализировать статические целые числа в области функций до начала запуска (в этом случае, это достаточно хорошо для меня.) Это то, что легко можно использовать. –
Технически нет. Но gcc имеет явный патч для гарантии того, что он работает в многопоточной среде. –