Нет, это не помогает.Если записи в created
и instance
не атомарны, то нет никакой гарантии, что значения видны потоку, который не блокирует мьютекс.
, например, поток 1 вызывает getInstance
.created
равно false
, а instance
равно нулю, поэтому он блокирует мьютекс и создает новый экземпляр.Поток 1 снова вызывает getInstance
, и на этот раз для created
устанавливается true
.Тема 2 теперь вызывает getInstance
.По капризам управления памятью процессора он видит created
как true
, но нет никакой гарантии, что он также видит instance
как ненулевое значение, и даже если это так, нет гарантии, что значения памяти дляуказываемые экземпляры непротиворечивы.
Если вы не используете атомикс, вам нужно использовать мьютексы и использовать их для всех обращений к защищенной переменной.
Дополнительная информация: Если выиспользуют мьютексы, тогда компилятор и среда выполнения работают вместе, чтобы гарантировать, что когда один поток снимает блокировку мьютекса, а другой поток получает блокировку этого же мьютекса, тогда второй поток может видеть все записи, выполненные первой.Это не верно для неатомарных обращений и может или не может быть правдой для атомарных доступов, в зависимости от того, какие ограничения порядка памяти компилятор и гарантия времени выполнения для вас (с атомарностью C ++ 11 вы можете выбрать ограничения порядка).