C ++ 0x: упорядочение памяти - PullRequest
5 голосов
/ 26 мая 2010

Текущий C ++ 0x черновик указывает в разделах 29.3.9 и 29.3.10, страницы 1111-1112, что в следующем примере:

// Thread 1
r1 = y.load(memory_order_relaxed);
x.store(1, memory_order_relaxed);

// Thread 2
r2 = x.load(memory_order_relaxed);
y.store(1, memory_order_relaxed);

Результат r1 = r2 = 1 возможен, так как операции каждого потока ослаблены и не связаны с адресами. Теперь мой вопрос о возможных результатах следующего (похожего) примера:

// Thread 1
r1 = y.load(memory_order_acquire);
x.store(1, memory_order_release);

// Thread 2
r2 = x.load(memory_order_acquire);
y.store(1, memory_order_release);

Я думаю, что в этом случае результат r1 = r2 = 1 невозможен. Если бы это было возможно, загрузка y синхронизировалась бы с хранилищем y (таким образом происходит раньше) с y. Как и в случае с x, загрузка x произойдет - до сохранения в x. Но загрузка y упорядочена до (и, следовательно, до того) хранения до x. Это создает циклическое отношение «происходит до», которое, я думаю, недопустимо.

1 Ответ

4 голосов
/ 26 мая 2010

Если мы потратим время (или, если хотите, последовательности команд), чтобы течь вниз, точно так же, как читаем код, то я понимаю, что

  • Ограждение получения позволяет другим доступам к памяти перемещаться вниз за пределы ограждения, но не вверх за пределы ограждения.
  • Съемное ограждение позволяет другим доступам к памяти перемещаться вверх за ограждение, но не вниз за ограждение

Другими словами, если у вас есть код типа

acquire
// other stuff
release

тогда обращения к памяти могут перемещаться из-за пределов пары получения / выпуска внутрь, но не наоборот (и они могут также не пропускать пару получения / выпуска полностью).

С семантикой ослабленной согласованности в вашем первом примере, о котором идет речь, аппаратное обеспечение может переупорядочивать обращения к памяти таким образом, чтобы хранилища входили в систему памяти перед загрузкой, что позволяет r1 = r2 = 1. С семантикой получения / выпуска во втором примере это переупорядочение предотвращается, и, таким образом, r1 = r2 = 1. невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...