2010-01-01 2 views
10

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

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

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

+3

Я думаю, что на сегодняшний день это будет называться C++ 1x – 2010-01-01 02:29:46

+0

Bjarne Stoustrup говорит, что x является шестнадцатеричным числом, поэтому еще 0x –

+0

@ Джон: Независимо от того, что он может думать или нравится, я понимаю, что Руководства ISO требуют, чтобы версии документов, таких как стандарты, находились в базе-10. – 2010-01-01 10:37:51

ответ

9

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

§ 6.7 stmt.decl

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

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

+3

Знаменитые последние слова «должно быть легко избежать». Чрезвычайно трудно избежать в общем случае. –

+0

@deft_code: +1, был недавно укушен этим. – peterchen