2010-02-17 4 views

ответ

4

Стандарт C++ не дает никаких гарантий относительно безопасности потока статических инициализации - вы должны рассматривать статическую инициализацию как требующую явной синхронизации.

цитата Александр Гесслер дает:

Если контроль входит в декларацию одновременно в то время как объект в процессе инициализации, одновременное выполнение будет ждать завершения инициализации

является из проекта C++ 0x и не отражает текущий стандарт C++ или поведение многих компиляторов C++.

В текущем стандарте C++, этот проход гласит:

Если контроль повторно входит в декларацию (рекурсивно) в то время как объект будучи инициализирован, поведение является неопределенным

+0

Даже проект C++ 0x имеет пример, подчеркивающий этот самый момент в конце параграфа 4 из 6.7. – dirkgently

+0

Спасибо за разъяснение. –

0

EDIT: Это относится к проекту C++ 0x.

Цитирование стандарта (6.7-4):

Если контроль входит в декларации одновременно в то время как объект инициализации, одновременное выполнение должно ждать завершения инициализации

К мое понимание, статическая инициализация, подобная этой, является потокобезопасной.

+0

Это цитата из черновика C++ 0x. –

+0

Да, действительно, это из черновика cpp0x. Итак, я предполагаю, что эта строка отсутствует в текущем стандарте? –

+0

Я добавил текст из текущего стандарта в свой ответ. –

2

No. Но учтите, что указатель на Blah - static.

6,7 Декларация заявление

4 [...] В противном случае такой объект инициализируется первый контроль времени проходит через его декларации; такой объект считается инициализированным после завершения его инициализации . Если инициализация выходов, бросая исключение, инициализации не завершена, так что будет опробован в следующий раз контроля входит в декларации

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