Определения заборов в стандарте C ++ [atomics.fences in n4713] - PullRequest
1 голос
/ 24 октября 2019

[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

Вопросы:

  1. Отражает ли приведенный выше код то, что говорит [atomics.fences.2]? Если нет, то как это должно выглядеть?

  2. Я думал, что разделительная граница должна быть упорядочена после операции X, потому что разделительная планка пытается сделать предыдущее хранилище видимым для других потоков по отношению кприобретаемое ограждение (B) и, следовательно, приобретаемое ограждение B следует упорядочить до операции Y. Нет?

...