Наиболее вероятная причина того, что вещи ведут себя не так, как вы ожидаете, заключается в том, что компилятор не ожидает, что выключение изменится, поэтому он рад оптимизировать его. Решение состоит в том, чтобы использовать правильные примитивы синхронизации потоков, такие как семафоры или condvars, чтобы получить ожидаемое поведение.
Примечание
Люди предложат отключить volatile
, и, вероятно, можно предположить, что запись в int атомарна. Это может помочь в большинстве случаев. Но даже в этом случае у вас могут возникнуть проблемы. На многоядерных машинах чтение и запись могут быть неожиданно переупорядочены, в результате чего вы пропустите важный сигнал. Intel имеет специальную инструкцию LOCK для решения этих случаев, но компилятор обычно не генерирует LOCK. В ARM у вас есть инструкция DMB, но она также вряд ли будет сгенерирована компилятором.
Итог при синхронизации потоков, используйте примитив ОС и не пытайтесь развернуть свой собственный. ВЫ ПОЛУЧИТЕ ЭТО НЕПРАВИЛЬНО