Код: Выделить всё
#include
#include
#include
#include
std::atomic x {}, y {};
void write_x_and_y() {
x.store(1, std::memory_order_seq_cst); // 1
y.store(-1, std::memory_order_relaxed); // 2
}
void read_x_then_y() {
while(x.load(std::memory_order_seq_cst) not_eq 1); // 3
assert(y.load(std::memory_order_seq_cst) < 0); // 4
}
int main(int argc, char *argv[]) {
A: std::thread t1(write_x_and_y), t2(read_x_then_y);
t1.join();
t2.join();
goto A;
}
< /code>
Во -первых, переупорядочение никогда не рассматривается. Потому что, если 2 - Если 1 не произошло, 3 и 4 никогда не произойдет, поэтому мы можем предположить, что 1 произойдет до 3 . У нас есть 1-> 3 и 1-> 4 ;
- В потоках T1 и T2 , мы имеем 1-> 2 и 3-> 4 .
[*] Последовательность S2: 1-> 3-> 2-> 4 ;
[*] Последовательность S3: 1-> 3-> 4-> 2 .
in s1 и s2, asd. S3 не является действительной глобальной последовательности. Мое мнение очень простое, расслабленное магазин может показаться в глобальной последовательности, только если некоторые операции нагрузки видят значение. В порядке S3, никто не видит результат y.store (-1) , поэтому 2 не может быть показан в глобальной последовательности.
Я спросил Chatgpt. Chatgpt дал мне тщательный анализ, но ответ смутил меня. Но я не могу найти кольцо в 1-> 3-> 4-> 2 , может быть, Chatgpt означает
Код: Выделить всё
|--------|
1->3->4->2
< /code>
На этом графике невозможно вернуться к стартовому узлу, когда мы пересекаем от стартового узла. А затем Chatgpt сказал, что определение цикла в глобальной последовательности отличается от определения в теории графика. Наконец, Chatgpt сказал, что вы можете перечислить все заказы и выравнивать их, если вы найдете < /p>
Order O1 : 1->3->4->2
Order O2 : 1->2
2 comes after 4 in O1 but 2 comes before 4 in O2,
Подробнее здесь: https://stackoverflow.com/questions/796 ... y-order-se
Мобильная версия