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

StackOverflow https://stackoverflow.com/questions/1962880

Вопрос

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top