Is C++ static member variable initialization thread-safe?

According to following resources, in C++(Specially Visual C++) scoped static variable initialization isn't thread safe. But, global static variables are safe.

Thread-safe static variables without mutexing?

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

So, is following code with static member variable thread-safe?

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;

Thanks in advance!

24
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

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

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

.
35
ответ дан 28 November 2019 в 23:47
поделиться

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

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

.
2
ответ дан 28 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: