В модели памяти 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
в T1 синхронизируется с хранилищем в b
в T2, чтобы установить, что хранилище в a
между потоками происходит до загрузки из a
, но насколько я могу судить, в стандарте сказано, что memory_order_seq_cst
хранилищ синхронизируются с нагрузками, но не наоборот.