Существует один общий порядок S для всех операций Memory_order::seq_cst, включая ограничения, который удовлетворяет следующим ограничениям. Во-первых, если A и B — операции Memory_order::seq_cst и A строго предшествует B, то A предшествует B в S.
Например:
Код: Выделить всё
#include
int main(){
std::atomic v;
v.store(1); // A
std::atomic_thread_fence(std::memory_order::seq_cst); // B
}
Ответ на приведенный выше вопрос является предпосылкой для обоснования следующего примера, лакмусовой бумажки переупорядочения StoreLoad, где второй поток заменяет нагрузку SC на ограждение SC и расслабленную нагрузку:
Код: Выделить всё
#include
#include
#include
int main() {
std::atomic v = 0;
std::atomic v2 = 0;
int c1 = 0, c2 = 0;
auto t1 = std::thread([&]() {
v.store(1); // #1
c1 = v2.load(); // #2
});
auto t2 = std::thread([&]() {
v2.store(1); // #3
std::atomic_thread_fence(std::memory_order::seq_cst); // #4
c2 = v.load(std::memory_order::relaxed); // #5
});
t1.join();
t2.join();
if (c1 == 0) {
assert(c2 == 1);
}
}
Код: Выделить всё
#2Во-вторых, для каждой пары атомарных операций A и B над объектом M, где A упорядочен по связности перед B, S должен удовлетворять следующим четырем условиям:
- если A и B являются операциями Memory_order::seq_cst, то A предшествует B в S; и
Следовательно, #2 < #3. Затем, предполагая, что #5 читается как 0, это означает, что #5 упорядочен по согласованности перед #1, а #4 происходит до #5, согласно пункту 3
, если ограничение Memory_order::seq_cst X происходит до того, как A и B являются Memory_order::seq_cst операция, то X предшествует B в S; и
Следовательно, #4 < #1. Важным моментом является то, применимо ли первое ограничение к забору. Если да, мы можем сделать вывод, что #3 < #4 в S, а затем вывести противоречие #4 < #1 < #2 < #3 < #4, которое представляет собой неверный общий порядок. Это делает предполагаемое выполнение невозможным. Другими словами, утверждение никогда не дает сбоя.
Итак, применимо ли первое ограничение к ограждению?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -to-fences
Мобильная версия