Volatile будет гарантировать, что компилятор не использует регистр для хранения переменной. Volatile не помешает компилятору переупорядочить код; хотя, это может послужить намеком, чтобы не менять порядок.
В зависимости от архитектуры некоторые инструкции являются атомарными. запись в целое число и чтение из целого числа часто являются атомарными. Если gcc использует атомарные инструкции для чтения / записи в целочисленную область памяти, один поток не будет считывать «промежуточный мусор», если другой поток находится в середине записи.
Но вы можете столкнуться с проблемами из-за переупорядочения компилятора и перестановки команд.
При включенной оптимизации gcc переупорядочивает код. Gcc обычно не переупорядочивает код, когда задействованы глобальные переменные или вызовы функций, поскольку gcc не может гарантировать тот же результат. Volatile может служить подсказкой для gcc относительно изменения порядка, но я не знаю. Если у вас возникнут проблемы с переупорядочением, это будет действовать как общий барьер компилятора для gcc:
__asm__ __volatile__ ("" ::: "memory");
Даже если компилятор не переупорядочивает код, ЦП постоянно переупорядочивает инструкции во время выполнения. Вот очень хорошая статья на эту тему. «Барьер памяти» используется для предотвращения изменения порядка команд процессором через барьер. Вот один из возможных способов сделать барьер памяти с помощью gcc:
__sync_synchronize();
Вы также можете выполнять инструкции asm для создания различных барьеров.
Тем не менее, мы читаем и пишем глобальные целые числа без использования атомарных операций или мьютексов из нескольких потоков и не имеем проблем. Скорее всего, это связано с тем, что: A) мы работаем на Intel, а Intel не переупорядочивает инструкции агрессивно, и B) выполняется достаточно кода, прежде чем мы сделаем что-то «плохое» с ранним чтением флага. В нашу пользу также тот факт, что многие системные вызовы имеют барьеры, а атомарные операции gcc являются барьерами. Мы используем много атомарных операций.
Вот хорошее обсуждение переполнения стека аналогичного вопроса.