Я не могу говорить о фактическом сценарии асинхронного доступа, поскольку я не слишком хорош в многопоточности, но то, что делает модификатор volatile
, говорит компилятору:
«Послушайте, это может измениться в любое время, так что не кешируйте его, не помещайте в регистр и не делайте ничего сумасшедшего, хорошо?»
Это не защищает от асинхронногопишет, он просто отключает оптимизации, которые недопустимы, если переменная может быть изменена внешними силами.
Редактировать: В качестве потенциального примера, тот, который не включает в себя многопоточность (но, действительно, включает в себя исключительно запутанный код;),Вот случай, когда volatile имеет важное значение:
volatile bool keepRunning = true;
void Stuff() {
int notAPointer = 0;
notAPointer = (int)(&keepRunning); //Don't do this! Especially on 64-bit processors!
while(keepRunning) {
*(bool*)(notAPointer) = false;
}
printf("The loop terminated!");
}
Без этого модификатора volatile компилятор может сказать: «Эй, keepRunning никогда не изменяется, поэтому мне даже не нужно генерировать код, который его проверяет!»,когда на самом деле мы просто секретно модифицируем его.
(На самом деле, это, вероятно, все еще будет работать на неоптимизированной сборке. И, возможно, это все еще будет работать, если компИлер умный и замечает, что указатель взят.Но принцип тот же)