Думаю ничего "переставлять" процессор не умеет. Но он может одновременно исполнять "пачку" команд, при этом результат исполнения последующих может сформироваться раньше чем предыдущих, т.е. эффект тот же.
И в чем разница?)
Кароч, как правельно? Не сказал, вычитал в инете и измывается, гад
Правильно использовать синглтон Майерса. Начиная с С++11 стандарт
гарантирует что переменная будет инициализирована потокобезопасно и ровно один раз:
Singleton *instance() {
static Singleton m_instance;
return &m_instance;
}
Ну ладно, мы не ищем легких путей. Откроем статью
...
Ну и в качестве барьера видимо надо заюзать
C++ (Qt)
std::atomic_thread_fence(std::memory_order_acquire);
Согласен, хорошее, грамотное решение. Правда не вижу зачем первый-то барьер понадобился?
Можно (и нужно) делать сам указатель атомиком,
8й слайдПервый барьер нужен ровно для того, для чего mutex::lock() нужно звать и на стороне читателя, и на стороне писателя. "Половинчатый" лок (и барьер) не защищает ни от чего.
И все-таки рискну предложить свою версию (без барьеров)
C++ (Qt)
if (!m_instance) {
std::unique_lock<std::mutex> l(m_mutex);
if (!m_instance) {
auto temp = new Singleton();
if (temp)
m_instance = temp;
}
}
return m_instance;
Круто. new не может вернуть 0, а значит компилятор может выкинуть вашу проверку, а значит, это ничем не отличается от кода выше=)
Я тоже Вам привел цитату что при чтении памяти могут быть варианты, но отнюдь не "что угодно"
Ну так и с указателем выше может быть только 0 или не 0, чо никак спасает от краша. Кроме невалидного значения там полно иных проблем, вызывающих UB. Что-то переставилось, что-то осело в регистре, где-то вместо временной переменой компилятор записал напрямую, где-то наоборот, добавил переменную, и всё, понеслась - предсказать результат программы нельзя.
Можно конечно жульничать и рассказывать всем что "у меня же работает" а можно взять и написать программу без UB и не тратить две недели на отладку.
Попытки быть "очень умным" разбиваются о то, что 99% программистов не понимает (включая меня), как работают современные ЦПУ, все знания на "школьном" уровне ассемблера из универа. Вы делаете какие-то предположения об архитектуре не имея не малейшего понятия, как оно там реально устроено. В чем смысл гадания на кофейной гуще? Есть стандарт, который четко говорит что есть UB, а что нет. Пока ваши попытки "сжульничать" с тем же синглтоном выглядят весьма неубедительно.
Я тоже Вам привел цитату что при чтении памяти могут быть варианты, но Ну каждый из этих мифов имеет весомые основания и не раз подтверждался на практике. Поэтому все они и подвержены (массовым) злоупотреблениям, т.е. тыкаются везде и без разбора. Замечу что Ваше использование атомиков тоже очень смахивает на очередной миф
Солнце встает на востоке и садится на западе, значит, вращается вокруг земли=) А что, подтверждается же на практике.
Ну и да, я не использую атомики, я использую мьютексы, потому что написание корректного lock-free алгоритма требует те же недели времени. Не верите - загляните в QMutex.