C ++ 0x статические инициализации и безопасность потоков

Я знаю, что в соответствии со стандартом C ++ 03 статическая инициализация области функций не гарантируется поточно-ориентированной:

void moo()
{
    static std::string cat("argent");  // not thread safe
    ...
}

Поскольку стандарт C ++ 0x, наконец, обеспечивает поддержку стандартных потоков, требуется ли статическая инициализация области функций для обеспечения безопасности потоков?


person R Samuel Klatchko    schedule 01.01.2010    source источник
comment
Думаю, с сегодняшнего дня он будет называться C ++ 1x   -  person    schedule 01.01.2010
comment
Бьярн Стауструп советует думать о x как о шестнадцатеричном числе, поэтому все равно 0x   -  person John Dibling    schedule 01.01.2010
comment
@John: Независимо от того, что он может думать или любить, я понимаю, что руководящие принципы ISO требуют, чтобы версия документов, таких как стандарты, была в базе 10.   -  person    schedule 01.01.2010
comment
Рекомендации ISO не имеют к этому никакого отношения, поскольку C ++ 0x не является официальным названием стандарта. Никогда не было и не будет. То же самое и с C ++ 1x. Это не имя ISO, поэтому правила ISO не имеют значения.   -  person jalf    schedule 01.01.2010


Ответы (1)


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

§ 6.7 stmt.decl

4. ... такой объект инициализируется при первом прохождении управления через его объявление ... Если элемент управления входит в объявление одновременно во время инициализации объекта, параллельное выполнение должно дождаться завершения инициализации ...

существует потенциальный крайний случай, если после возврата из main () деструктор статического объекта вызывает функцию после того, как статический локальный объект уже уничтожен, поведение не определено. однако этого должно быть легко избежать.

person jspcal    schedule 01.01.2010
comment
Известных последних слов должно быть легко избежать. В общем случае этого чрезвычайно трудно избежать. - person deft_code; 28.01.2010