Подтвердить что ты не робот

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

Согласно следующим ресурсам, в С++ (специально Visual С++) статическая инициализация с фиксированной переменной не является потокобезопасной. Но глобальные статические переменные безопасны.

Статические переменные, не зависящие от темы без мьютекса?

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

Итак, следует ли код со статической переменной-членом без потоков?

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;

Спасибо заранее!

4b9b3361

Ответ 1

Это скорее вопрос о статических переменных, связанных с функциональными возможностями, и о любых других статических переменных, а не о скоординированных по сравнению с глобальными.

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

Ответ 2

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

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