атомное чтение
Как было сказано ранее, это зависит от платформы. На x86 значение должно быть выровнено по границе 4 байта. Обычно для большинства платформ чтение должно выполняться в одной инструкции CPU.
кэширование оптимизатора
Оптимизатор не знает, что вы читаете значение, измененное другим потоком. объявление значения volatile
помогает в этом: оптимизатор будет выдавать память для чтения / записи для каждого доступа, вместо того, чтобы пытаться сохранить значение, кэшированное в регистре.
Кэш процессора
Тем не менее, вы можете прочитать устаревшие значения, так как на современных архитектурах у вас есть несколько ядер с индивидуальным кэшем, который не синхронизируется автоматически. Вам нужен барьер чтения памяти, обычно инструкция для конкретной платформы.
В Wintel функции синхронизации потоков автоматически добавят полный барьер памяти, или вы можете использовать функции InterlockedXxxx .
MSDN: Проблемы с памятью и синхронизацией , MemoryBarrier Макрос
[править] пожалуйста, смотрите также комментарии drhirsch.