Процесс, который печатает "x is 7", должен будет "видеть", что x не равен -7 в момент, когда он выполняет свой if-тест, но тогда x должен стать 7 к моменту, когда printf()
читает егозначение, чтобы распечатать его.Итак, что-то вроде:
Process #1: x = x - 1; // x becomes 6
Process #2: x = x - 1; // x becomes 5
Process #1: x = x + 1; // x becomes 6
Process #1: if (x != 7) // if-test succeeds, because x is 6
Process #2: x = x + 1; // x becomes 7
Process #1: printf("x is %d", x); // prints "x is 7"
Обратите внимание, что это только один из вышеперечисленных способов;особенно, если x
не изменяется атомарно, существует множество других способов, с помощью которых вещи могут также стать странными из-за распределения регистров, взаимодействия с кэшем ЦП, оптимизации компилятором и переупорядочения кода с использованием «как будто»Правило и т. д.