Дырка в том, что вы считаете, что существует некоторый "физический порядок" между событиями записи x и y. Скажем, представьте себе, что потоки стоят в вершинах квадрата в порядке a c b d и передают данные пакетами вдоль по этому квадрату.
Ну я не про порядок в мире железок, а про условия в потоках, кт и задают некий порядок. А то что они работают параллельно я представить могу, почему они могут получать разные комбинации - не понимаю. Как поток кт проверяет в цикле x, может видеть y == false, если в другом потоке y стал true иначе он бы не прошел тот поток и было бы наоборот, но так или иначе z должно быть > 0, потому что таково условие и как компилятор может зареордерить, чтобы это испортить? :0