Является ли C ++ статическая переменная-член инициализация переменной потокобезопасным? - PullRequest
23 голосов
/ 26 декабря 2009

Согласно следующим ресурсам, инициализация статических переменных в 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;

Заранее спасибо!

Ответы [ 2 ]

34 голосов
/ 26 декабря 2009

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

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

2 голосов
/ 26 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...