Является ли инициализация переменных статических членов 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(), в то время как существует только один активный поток. Статические переменные в области видимости создаются при первом вызове их содержащей функции. В стандарте ничего не говорится о том, как строится статика на уровне функций, когда функция вызывается в нескольких потоках. Однако каждая реализация, с которой я работал, использует блокировку вокруг конструктора (с дважды проверенным флагом), чтобы гарантировать безопасность потока.
Да(*). Когда глобальная статика инициализируется, вокруг только один поток, и все конструкторы вызываются в нем. Это не верно для статики функции, однако.
(*) Можно сделать глобальную статику не поточно-ориентированной, создав потоки в некоторых конструкторах и запланировав некоторые этапы инициализации в этих потоках. В этом случае применяются обычные правила безопасности нитей.