Семантика приобретения / выпуска


В ответе переупорядочивание хранилища происходит при компиляции C++ для x86 @Peter Cordes написал

Для получения/освобождения семантики, чтобы дать вам желаемый порядок, последний магазин должен быть магазином выпуска, а загрузка приобретения должна быть первый груз. Вот почему я сделал y std:: атомным, хотя вы и установка x в 0 или 1 больше похожа на флаг.

Я хотел бы задать несколько вопросов, чтобы лучше понять его.

Я читал http://preshing.com/20120913/acquire-and-release-semantics также. И эта статья содержит:: Введите описание изображения здесь

И написано, что обеспечено, что r2 == 42. Я не понимаю почему. На мой взгляд это возможно: 1. Thread2 выполнил первую строку. Он атомарен, и это memory_order_acquire, поэтому он должен быть выполнен перед следующими операциями памяти.

  1. Теперь Thread2 выполняет вторую строку: int r2 = A и r2 равно 0.

  2. Затем Thread1 выполнит его код.

Почему я ошибаюсь?

1 3

1 ответ:

Полная цитата:

Если мы позволим обоим потокам работать и найдем, что r1 == 1, то это служит в качестве подтверждение того, что значение, присвоенное в потоке 1, было передано успешно к потоку 2. Таким образом, мы гарантируем, что r2 == 42.

Семантика aquire-release гарантирует только то, что

  • A = 42 не происходит после Ready = 1 в потоке 1
  • r2 = A не происходит раньше r1 = Ready в потоке 2

Таким образом, значение r1 должно быть проверено в потоке 2, чтобы убедиться, что A был записан потоком 1. Сценарий в вопросе действительно может произойти, но r1 будет 0 в этом случае.