Вероятно, это связано с тем, что компилятор обычно не думает о многопоточности при оптимизации вашего кода. Если вы видели, как код проверяет значение несколько раз, и он знает, что в однопоточном режиме это значение не может измениться, поэтому он просто пропустил проверку.
Если вы объявите переменную как volatile
, то, вероятно, она сгенерирует менее эффективный код, который проверяет чаще.
Конечно, вы также должны понимать, что когда записывается значение, существуют обстоятельства, когда не все могут быть записаны в одном go, поэтому, если вам не повезло, чтобы прочитать его обратно, когда оно наполовину написано, то вы получите обратно мусорное значение. Решение этой проблемы заключается в том, чтобы объявить его как std :: atomi c (который автоматически считается энергозависимым для оптимизатора), а затем будет выдан еще более сложный код, чтобы гарантировать, что запись и чтение не могут пересекаться (или другой процессор примитивы могут использоваться для небольших объектов, таких как целые числа)
большинство переменных не разделяются между потоками, и когда они есть, программист должен определить их и оптимизировать баланс с потребностями синхронизации потока во время проектирования.