C ++ 11 и выше: локальное статическое создание является поточно-ориентированным.
Стандарт гарантирует, что:
- Создание синхронизировано.
- Если создание выдает исключение, в следующий раз, когда поток выполнения пройдет точку определения переменной, попытка создания будет предпринята снова.
Как правило, это выполняется с двойной проверкой:
- сначала проверяется локальный флаг потока, и если он установлен, то к переменной обращаются.
- , если еще не установлен, то берется более дорогой синхронизированный путь, и еслиПосле этого создается переменная, устанавливается локальный флаг потока.
C ++ 03 и C ++ 98: стандарт не знает потока.
Нет никаких потоков в том, что касается Стандарта, и поэтому в Стандарте нет положений, касающихся синхронизации между потоками.
Однако некоторые компиляторы реализуют на больше , чем стандартные мандатыЛибо в течением расширений или предоставляя более строгие гарантии, так что обратите внимание на интересующие вас компиляторы. Если они хорошего качества, есть вероятность, что они это гарантируют.
Наконец, это может быть необязательно дляэто должно быть потокобезопасным.Если вы вызовете этот метод за до создания какого-либо потока, то вы убедитесь, что он будет правильно инициализирован до того, как в игру вступит реальная многопоточность, и вы аккуратно обойдете проблему.