Компилятор действительно может изменить порядок ваших назначений в функции set_values
. Однако это не требуется. В этом случае нет необходимости переупорядочивать что-либо, поскольку вы назначаете константы для всех четырех переменных.
Теперь программа застряла в бесконечном цикле.
Этовероятно, потому что while(notification != 1);
будет оптимизирован до бесконечного цикла.
Немного поработав, мы сможем найти способ заставить компилятор переупорядочить присваивание notify = 1
перед другими операторами, см. https://godbolt.org/z/GY-pAw. Обратите внимание, что программа читает x
из стандартного ввода, это делается для того, чтобы заставить компилятор читать из области памяти.
Я также сделал переменную notification
volatile, чтобы while(notification != 1);
не оптимизировался.
Вы можете попробовать этот пример на своей машине, я смогчтобы постоянно проваливать утверждение, используя g ++ 9.2 и -O3, работающие на процессоре Intel Sandy Bridge.
Имейте в виду, что сам процессор может переупорядочивать инструкции, если они независимы друг от друга, см. https://en.wikipedia.org/wiki/Out-of-order_execution. Это, однако, немного сложно для тестирования и воспроизведения последовательно.