@PeterCordes Я полностью согласен .. Безопасно использовать односторонний барьерный подход для описания того, как все работает. Это также (по крайней мере, для меня) самый простой способ визуализации вещей.

ели памяти C ++ существует общий порядок для всех загрузок и хранилищ всех последовательно согласованных операций. Мне интересно, как это взаимодействует с операциями, которые имеют другие упорядочения памяти, которые упорядочены до / после последовательной последовательной загрузки.

Например, рассмотрим два потока:

std::atomic<int> a(0);
std::atomic<int> b(0);
std::atomic<int> c(0);

//////////////
// Thread T1
//////////////

// Signal that we've started running.
a.store(1, std::memory_order_relaxed);

// If T2's store to b occurs before our load below in the total
// order on sequentially consistent operations, set flag c.
if (b.load(std::memory_order_seq_cst) == 1) {
  c.store(1, std::memory_order_relaxed)
}


//////////////
// Thread T2
//////////////

// Blindly write to b.
b.store(1, std::memory_order_seq_cst)

// Has T1 set c? If so, then we know our store to b occurred before T1's load
// in the total order on sequentially consistent operations.
if (c.load(1, std::memory_order_relaxed)) {
  // But is this guaranteed to be visible yet?
  assert(a.load(1, std::memory_order_relaxed) == 1);
}

Гарантируется ли, что утверждение в T2 не может срабатывать?

Я ищу подробные цитаты стандарта здесь. В частности, я думаю, что для этого потребуется показать, что нагрузка отb в Т1синхронизируется с магазин вb в T2, чтобы установить, что магазинa межпоточность происходит до загрузки изa, но, насколько я могу судить, стандарт говорит, чтоmemory_order_seq_cst магазины синхронизируются с нагрузками, а не наоборот.

Ответы на вопрос(1)

Ваш ответ на вопрос