Я не могу говорить о фактическом сценарии асинхронного доступа, так как я не очень хорошо разбираюсь в многопоточности, но модификатор 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 никогда не модифицируется, так что мне даже не нужно генерировать код, который его проверяет!», хотя на самом деле мы просто модифицируем его тайно.
(На самом деле это, вероятно, все еще будет работать на неоптимизированной сборке. И это также может работать, если компилятор умен и замечает берущийся указатель. Но принцип тот же)
person
Mike Caron
schedule
12.11.2010
volatile
. Подводя итог: это не имеет ничего общего с асинхронным доступом или ограничениями памяти, и оно всё связано с предоставлением компилятору возможности обнаруживать места, где вы можете ошибиться. Так же, как когда вы пытаетесь присвоить значение переменнойconst
. - person John Dibling   schedule 12.11.2010:)
- person sbi   schedule 12.11.2010volatile
нужно использовать в многопоточности? Другие:volatile
не имеет ничего общего с многопоточностью Pooria: я не спрашиваю о многопоточности - person John Dibling   schedule 13.11.2010