Чтобы подчеркнуть, почему это необходимо, вы можете увидеть следующий пример:
Если вы напишите что-то вроде этого:
void parallel_function(){
//Example function, this doesn't exist, but it is good to let you understand
pthread_mutex_is_free(&lock);
doStuff();
}
Тогда pthread_mutex_is_free будет делать некоторые проверки, чтобы увидеть, если мьютекс свободен, прежде чем зафиксировать его.
И здесь есть подвох, проблема заключается в оптимизации компилятора, потому что для него код выполняется из одного потока, поэтому он может пропустить эту проверку (мьютекс свободен), потому что он видит, что эта переменная установлена перед как бесплатный и никогда не изменяемый, поэтому он всегда будет бесплатным, и это бесполезно, поэтому пропускается в скомпилированном коде.
Таким образом, используя Volatile, заставить компилятор, чтобы избежать такого рода проверки, в основном говорю это, чтобы ожидать эту переменную, чтобы изменить волшебно и так, чтобы избежать статических оптимизаций.