Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

§ 6.7 stmt.decl

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

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