Дано:C++ поточно статический конструктор
void getBlah() {
static Blah* blah = new Blah();
return blah;
}
В многопоточных настройки а, возможно, что новый Бла() вызывается более одного раза?
Спасибо!
Дано:C++ поточно статический конструктор
void getBlah() {
static Blah* blah = new Blah();
return blah;
}
В многопоточных настройки а, возможно, что новый Бла() вызывается более одного раза?
Спасибо!
Стандарт C++ не дает никаких гарантий относительно безопасности потока статических инициализации - вы должны рассматривать статическую инициализацию как требующую явной синхронизации.
цитата Александр Гесслер дает:
Если контроль входит в декларацию одновременно в то время как объект в процессе инициализации, одновременное выполнение будет ждать завершения инициализации
является из проекта C++ 0x и не отражает текущий стандарт C++ или поведение многих компиляторов C++.
В текущем стандарте C++, этот проход гласит:
Если контроль повторно входит в декларацию (рекурсивно) в то время как объект будучи инициализирован, поведение является неопределенным
EDIT: Это относится к проекту C++ 0x.
Цитирование стандарта (6.7-4):
Если контроль входит в декларации одновременно в то время как объект инициализации, одновременное выполнение должно ждать завершения инициализации
К мое понимание, статическая инициализация, подобная этой, является потокобезопасной.
Это цитата из черновика C++ 0x. –
Да, действительно, это из черновика cpp0x. Итак, я предполагаю, что эта строка отсутствует в текущем стандарте? –
Я добавил текст из текущего стандарта в свой ответ. –
No. Но учтите, что указатель на Blah
- static
.
6,7 Декларация заявление
4 [...] В противном случае такой объект инициализируется первый контроль времени проходит через его декларации; такой объект считается инициализированным после завершения его инициализации . Если инициализация выходов, бросая исключение, инициализации не завершена, так что будет опробован в следующий раз контроля входит в декларации
Даже проект C++ 0x имеет пример, подчеркивающий этот самый момент в конце параграфа 4 из 6.7. – dirkgently
Спасибо за разъяснение. –