volatile
в основном говорит компилятору, что он не может делать предположения о том, что находится в определенной области памяти.Например,
bool test = true;
while(!test)
{
/* do something (e.g. wait) */
}
компилятор может оптимизировать все while
, поскольку он предполагает, что test
всегда верно.Однако, если в какой-то момент test
будет обновляться откуда-то еще (например, с некоторым оборудованием или другим потоком), мы не хотим, чтобы компилятор предполагал, что он знает, что находится в test
.Мы можем сказать компилятору, что использование volatile
.
Как говорят другие ответы, не дает никаких гарантий относительно того, в каком порядке объекты обращаются к ячейке памяти.
Ps Я бесстыдно украл этот пример изгде-то, но не могу вспомнить, где я это видел.