(при условии c / c ++): если (flag) не объявлен как volatile, thread1 может считывать значение флага из регистра, поэтому он может никогда не увидеть, что thread2 изменил расположение памяти в флаге на 1, и, таким образом, thread1 может продолжить зацикливание навсегда, хотя thread2 устанавливает флаг в 1.
Другая возможность может заключаться в том, что thread1 работает с более высоким приоритетом, чем thread2, поэтому thread2 никогда не получает возможности запустить и установить flag = 1, потому что thread1 навсегда запустит процессор в себя.