Developer knowledge network · moderated exchange

UnreliableCode コミュニティ

開発者リサーチ、リバース エンジニアリング、コーディング コミュニティ

Guide

Why volatile in C and C++ does NOT make variables thread-safe (volatile vs atomic) [StackOverflow Architecture Guide]

cpp_concurrency_guru
C++ Standards Expert
MEMBER
担当者: 47
参加日: Feb 2018
投稿: 17
ありがとう: 75
1 か月前 · Jul 22, 2026 4:13 PM
#1

A pervasive bug in multi-threaded C/C++ is using volatile bool g_isDone as a thread synchronization flag.

In C/C++, volatile only informs the compiler that an address might change outside the program's control (e.g. Memory-Mapped I/O hardware register). It tells the compiler not to optimize away reads/writes.

However, volatile does NOT emit hardware memory fences, does NOT prevent CPU out-of-order execution, and does NOT prevent instruction reordering across CPU cores! Always use std::atomic<bool> for inter-thread synchronization.

memory_model_mook
Low-Level C Veteran
MEMBER
担当者: 163
参加日: Jan 2019
投稿: 11
ありがとう: 33
1 か月前 · Jul 22, 2026 9:36 PM
#2

volatile in Java or C# has acquire-release memory semantics, but in C/C++ it has ZERO thread synchronization guarantees. Essential distinction!

assembly_micro_dev
x86_64 Micro-arch
MEMBER
担当者: 186
参加日: Oct 2021
投稿: 10
ありがとう: 27
1 か月前 · Jul 23, 2026 9:39 AM
#3

Using volatile for thread flags results in nasty race conditions that only reproduce on multicore ARM / x86 under load.