All atomic types defined by the standard library can be found in the <atomic>
header library. The system guarantees the atomicity to these types and all the related operations with these types. Some operations may not be atomic, but the system creates the illusion of atomicity in such cases. The standard atomic types use a member function, is_lock_free()
, that allows the user to determine whether operations on a given type are done directly with atomic instructions (is_lock_free()
returns true
) or done using internal locks by the compiler and library (is_lock_free()
returns false
).
std::atomic_flag
is different among all atomic types. The operations on this type are required to be atomic as per the standard. Hence, this doesn't provide the is_lock_free()
member function. This is a very simple type with a minimal set of allowed operations such as test_and_set()
(they can be either queried or set) or clear()
(clears the value).
The remaining atomic types follow a similar signature...