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