...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Copyright © 2011 Helge Bahmann
Copyright © 2012 Tim Blechmann
Copyright © 2013, 2017, 2018, 2020-2022 Andrey Semashev
Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Table of Contents
Boost.Atomic is a library that provides
atomic
data types and operations on these data types,
as well as memory ordering constraints required for coordinating multiple
threads through atomic variables. It implements the interface as defined
by the C++11 standard, but makes this feature available for platforms lacking
system/compiler support for this particular C++11 feature.
Users of this library should already be familiar with concurrency in general, as well as elementary concepts such as "mutual exclusion".
The implementation makes use of processor-specific instructions where possible (via inline assembler, platform libraries or compiler intrinsics), and falls back to "emulating" atomic operations through locking.
Operations on "ordinary" variables are not guaranteed to be atomic.
This means that with int n=0
initially, two threads concurrently
executing
void function() { n ++; }
might result in n==1
instead of 2: Each thread will read
the old value into a processor register, increment it and write the result
back. Both threads may therefore write 1
, unaware that
the other thread is doing likewise.
Declaring atomic<int> n=0
instead, the same operation
on this variable will always result in n==2
as each operation
on this variable is atomic: This means that each operation
behaves as if it were strictly sequentialized with respect to the other.
Atomic variables are useful for two purposes:
Take a look at the examples section for common patterns.