Семантика приобретения / выпуска
В ответе переупорядочивание хранилища происходит при компиляции C++ для x86 @Peter Cordes написал
Я хотел бы задать несколько вопросов, чтобы лучше понять его.Для получения/освобождения семантики, чтобы дать вам желаемый порядок, последний магазин должен быть магазином выпуска, а загрузка приобретения должна быть первый груз. Вот почему я сделал y std:: атомным, хотя вы и установка x в 0 или 1 больше похожа на флаг.
Я читал http://preshing.com/20120913/acquire-and-release-semantics также. И эта статья содержит::
И написано, что обеспечено, что r2 == 42
. Я не понимаю почему. На мой взгляд это возможно:
1. Thread2 выполнил первую строку. Он атомарен, и это memory_order_acquire, поэтому он должен быть выполнен перед следующими операциями памяти.
-
Теперь Thread2 выполняет вторую строку:
int r2 = A
иr2
равно0
. -
Затем Thread1 выполнит его код.
Почему я ошибаюсь?
1 ответ:
Полная цитата:
Если мы позволим обоим потокам работать и найдем, что r1 == 1, то это служит в качестве подтверждение того, что значение, присвоенное в потоке 1, было передано успешно к потоку 2. Таким образом, мы гарантируем, что r2 == 42.
Семантика aquire-release гарантирует только то, что
A = 42
не происходит послеReady = 1
в потоке 1r2 = A
не происходит раньшеr1 = Ready
в потоке 2Таким образом, значение
r1
должно быть проверено в потоке 2, чтобы убедиться, чтоA
был записан потоком 1. Сценарий в вопросе действительно может произойти, ноr1
будет0
в этом случае.