Для однопотокового кода состояние в абстрактной машине непосредственно не наблюдается: для объектов, которые не являются энергозависимыми, не гарантируется какое-либо конкретное состояние, когда вы останавливаете единственный поток с сигналом и наблюдаете его с помощью ptrace
илиэквивалент.Единственное требование состоит в том, чтобы выполнение программы имело такое же наблюдаемое поведение, как и поведение одного возможного выполнения абстрактной машины.
Наблюдаемые - это взаимодействия с внешним миром;в основном, ввод / вывод в потоках и действия над изменчивыми объектами.
Компилятор для однопоточного кода может генерировать код, который выполняет операции с глобальными переменными или другим объектом, который оказывается разделенным между потоками, если толькосемантика одного потока уважается.Это, очевидно, тот случай, когда глобальная переменная изменена таким образом, что она возвращает свое первоначальное значение.
Например, компилятор может выдавать код, который увеличивает, а затем уменьшает переменную, по крайней мере, в некоторых редких случаях.;цель состоит в том, чтобы создать простой код за счет нескольких случайных ненужных операций.
Такие изменения общих переменных, которых нет в абстрактной машине, очевидно, сломали бы многопоточный код, который одновременно выполняет реальную операцию;в таком коде нет условий гонки при обращении к разделяемой переменной, которые правильно сериализованы, но сгенерированный код ввел гонку, которая нарушает программу.