@ Томас Эдлсон Ваше право. Я совершенно не понял вопроса.

+ и опасности двойной проверки блокировкиСуществует код для правильной реализации шаблона, который предлагается авторами. Смотри ниже,Мне просто интересно, можно ли переместить первый барьер памяти прямо над оператором return?

Singleton* Singleton::instance () {
    Singleton* tmp = pInstance;
    ... // insert memory barrier (1)
    if (tmp == 0) {
        Lock lock;
        tmp = pInstance;
        if (tmp == 0) {
            tmp = new Singleton;
            ... // insert memory barrier (2)
            pInstance = tmp;
        }
    }
    return tmp;
}

РЕДАКТИРОВАТЬ

: Другой вопрос: в связанной статье, какvidstige цитируемыйТехнически вам не нужны полные двунаправленные барьеры. Первый барьер должен предотвращать нисходящую миграцию конструкции Синглтона (другим потоком); второй барьер должен предотвращать миграцию инициализации pInstance вверх. Они называются операциями «приобретения» и «выпуска» и могут дать лучшую производительность, чем полные барьеры на аппаратном обеспечении (например, Itainum), что делает различие.

В нем говорится, что второй барьер не обязательно должен быть двунаправленным, так как же он может предотвратить перемещение назначения pInstance до этого барьера? Хотя первый барьер может предотвратить миграцию вверх, но другой поток все еще может иметь шанс увидеть неинициализированные элементы.

РЕДАКТИРОВАТЬ

Я думаю, что я почти понимаю цель первого барьера. Как: sonicoder Замечено, что предсказание ветвления может привести к тому, что tmp станет NULL, если if вернет true. Чтобы избежать этой проблемы, должен быть барьер получения, чтобы предотвратить чтение tmp взамен перед чтением в if.Первый барьер соединяется со вторым барьером для достижения

синхронизироваться-с отношения, так что можно двигаться вниз.РЕДАКТИРОВАТЬ

: Тем, кто интересуется этим вопросом, настоятельно рекомендую прочитатьпамять barriers.txtВам необходим mem-барьер, чтобы обеспечить принудительный доступ к памяти в инструкциях. Подумайте о таких проблемах, как предикатирование веток и как это может испортить внутреннее выражение if..

Ответы на вопрос(2)

Ваш ответ на вопрос