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