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

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

потокобезопасным статические переменные без mutexing?

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

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

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;

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

2 ответов


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

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


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

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