Абсолютно нет гарантии того, что "x - x + 1"
будет компилироваться в безопасные для прерывания инструкции на любой платформе, включая x86. Вполне может быть, что это безопасно для конкретного компилятора и конкретной архитектуры процессора, но это не предусмотрено стандартами вообще, и стандарт - единственная гарантия, которую вы получаете.
Вы не можете считать что-либо безопасным, исходя из того, что, по вашему мнению, будет компилироваться. Даже если определенный компилятор / архитектура заявляет, что это так, полагаться на него очень плохо, так как это снижает переносимость. Другие компиляторы, архитектуры или даже более поздние версии на том же компиляторе и архитектуре могут довольно легко нарушить ваш код.
Вполне возможно, что x = x + 1
может скомпилироваться в произвольную последовательность, такую как:
load r0,[x] ; load memory into reg 0
incr r0 ; increment reg 0
stor [x],r0 ; store reg 0 back to memory
на процессоре без инструкций увеличения памяти. Или он может быть умным и скомпилировать его в:
lock ; disable task switching (interrupts)
load r0,[x] ; load memory into reg 0
incr r0 ; increment reg 0
stor [x],r0 ; store reg 0 back to memory
unlock ; enable task switching (interrupts)
где lock
отключает, а unlock
разрешает прерывания. Но даже в этом случае это может быть поточно-ориентированным в архитектуре, в которой более одного из этих процессоров совместно используют память (lock
может отключать прерывания только для одного процессора), как вы уже заявили.
Сам язык (или библиотеки для него, если он не встроен в язык) будет обеспечивать поточно-ориентированные конструкции, и вы должны использовать их, а не зависеть от вашего понимания (или, возможно, неправильного понимания) того, какой машинный код будет сгенерирован.
Такие вещи, как Java synchronized
и pthread_mutex_lock()
(доступны для C в некоторых ОС) - это то, что вы хотите изучить.