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