TL / DR : правда ли, что только 1 (а не 2) из 4 переупорядочений допускается для операций приобретения / выпуска? Если так, то почему?
Пока из того, что я понял о семантике приобретения-выпуска, является (в основном)
- операция получения не позволяет грузам / хранилищам под ней плавать над ней
- операция освобождения не позволяет грузам / хранилищам выше нее скользить под ней
Но об обратном направлении говорят меньше.
Из некоторых источников (блоги Джеффа Прешинга и других, и некоторые руководства по архитектуре, по-видимому, подразумевают, что это) я прочитал, что операции получения / выпуска эквивалентны (атомный op + барьер памяти в данной области памяти) / (барьер памяти + атомная операция) соответственно.
Они описывают 4 вида барьеров памяти и говорят, что, например, В операции получения используется барьер, подобный LoadLoad + LoadStore (и аналогичный для выпуска).
Как я понимаю, эти барьеры (соответственно LoadLoad + LoadStore и StoreStore + LoadStore) позволяют:
магазин, который проскользнет под приобретение
груз, чтобы плавать выше выпуска
И груз не может проскользнуть под приобретением / магазин не может плавать выше выпуска.
Это вообще правильно? Это правильно для C ++? Отличается ли C ++ от общего значения?
(потому что, например, этот ответ говорит, что нагрузка может проскальзывать под приобретением (насколько я понимаю). У меня также было несколько источников, в которых говорилось, что что-либо может проскользнуть под приобретением (и наоборот) ).)
Если это правильно, то для чего это нужно? Я пытался придумать что-то вроде (для выпуска):
x.store(5, std::memory_order_release);
y.store(true, std::memory_order_relaxed);
И другой поток, читающий их в другом порядке, был бы плохим, учитывая, что он используется в шаблонах, таких как двойная проверка блокировки.
Это близко к причине? Если да, то может ли кто-нибудь привести убедительные примеры как приобретения, так и выпуска?
В то время как для магазина, проскальзывающего под приобретением / нагрузкой, плавающей над выпуском, (вероятно) таких недостатков нет ...