Last Updated: May 17, 2026
When two threads touch the same variable without protection, the result isn't just unpredictable, it's undefined. The fix you've already seen is std::mutex, which is the right answer for anything more complex than a single read or write. But for small counters, flags, and shared scalars, locking a mutex on every update is overkill. std::atomic<T> gives you indivisible reads, writes, and updates on simple types without a mutex, and this chapter shows what it can do, what it can't, and where its sharp edges hide.