C++: Strongly Happens Before?
Коротко о «strongly happens-before»
В C++20 появилось новое отношение strongly happens-before (SHB), потому что старое happens-before оказалось недостаточно строгим.
Пример кода
std::atomic<int> x{0}, y{0};
// thread-1
x.store(1, seq_cst);
y.store(1, release);
// thread-2
int b = y.fetch_add(1, seq_cst); // b = 1
int c = y.load(relaxed); // c = 3
// thread-3
y.store(3, seq_cst);
int a = x.load(seq_cst); // a = 0
Почему нужен SHB
- Каждый атомарный объект имеет modification order — полный порядок всех записей.
- Классические правила coherence (write-write, read-read, read-write, write-read) связывают happens-before с этим порядком.
- Но при смешанных
memory_order(например,release+seq_cst) между потоками могут образоваться «дыры», где старое happens-before не гарантирует ожидаемую последовательность.
Отличие SHB от HB
- SHB добавляет требование: если операция A strongly happens-before B, то все наблюдатели видят записи A раньше записей B, даже при разных
memory_order. - Для
seq_cstSHB совпадает с HB; дляrelease/acquireHB может быть, а SHB — нет.
Итог
Если пользуетесь только seq_cst, можно не заморачиваться. При смешанных порядках SHB — формальный способ не получить «невозможные» значения.