Является ли инициализация переменных статических членов C++ поточно-ориентированной?

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

Потоково-безопасные статические переменные без мьютексирования?

http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx

Итак, следующий код со статической переменной-членом является потокобезопасным?

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;

Заранее спасибо!

2 ответа

Решение

Это больше вопрос статических переменных в функциональной области по сравнению со всеми другими статическими переменными, а не в глобальных или в глобальных.

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

Да(*). Когда глобальная статика инициализируется, вокруг только один поток, и все конструкторы вызываются в нем. Это не верно для статики функции, однако.

(*) Можно сделать глобальную статику не поточно-ориентированной, создав потоки в некоторых конструкторах и запланировав некоторые этапы инициализации в этих потоках. В этом случае применяются обычные правила безопасности нитей.

Другие вопросы по тегам