[atomics.fences.2]:
Разделительная скоба A синхронизируется с защитной рамкой B, если существуют атомарные операции X и Y, обе из которых работают на некотором атомарном объекте M, так что Aчередуется до X, X изменяет M, Y чередуется до B, а Y считывает значение, записанное X, или значение, записанное любым побочным эффектом в гипотетической последовательности деблокирования X, будет начинаться, если бы это была операция деблокирования.
Итак, потенциальный пример кода выглядит следующим образом:
std::atomic<uint32_t> M;
//Thread K
std::atomic_thread_fence(std::memory_order::release); // release fence A sequenced before
M.store(1, std::memory_order::relaxed); // operation X: operating on atomic object M
//Thread J
M.load(std::memory_order::relaxed); // operation Y: operating on atomic object M -- reading sequenced before
std::atomic_thread_fence(std::memory_order::acquire); // acquire fence B
Вопросы:
Отражает ли приведенный выше код то, что говорит [atomics.fences.2]? Если нет, то как это должно выглядеть?
Я думал, что разделительная граница должна быть упорядочена после операции X, потому что разделительная планка пытается сделать предыдущее хранилище видимым для других потоков по отношению кприобретаемое ограждение (B) и, следовательно, приобретаемое ограждение B следует упорядочить до операции Y. Нет?