Вы используете volatile
/ Thread.MemoryBarrier()
, когда хотите получить доступ к переменной через потоки без блокировки.
Переменные, которые являются атомарными, как, например, int
, всегда читаются и записываются целыми одновременно. Это означает, что вы никогда не получите половину значения до того, как другой поток изменит его, а другую половину - после его изменения. Благодаря этому вы можете безопасно читать и записывать значение в разных потоках без синхронизации.
Однако компилятор может оптимизировать некоторые операции чтения и записи, которые вы предотвращаете с помощью ключевого слова volatile
. Если у вас, например, есть такой цикл:
sum = 0;
foreach (int value in list) {
sum += value;
}
Компилятор может фактически выполнять вычисления в регистре процессора и записывать значение только в переменную sum
после цикла. Если вы сделаете sum
переменную volatile
, компилятор сгенерирует код, который читает и записывает переменную для каждого изменения, чтобы ее значение было актуальным на протяжении всего цикла.