C++ Library - <stdatomic>
The <stdatomic> header in C++, provides a set of functions to perform atomic operations on shared variables, to enable thread-safe manipulation of data. This header is part of the concurrency support library.
The <stdatomic> header shall define the atomic_flag type as a structure type (provides the classic test-and-set functionality) having two states, set and clear.
Including <stdatomic> Header
To include the <stdatomic> header in your C++ program, you can use the following syntax.
#include <stdatomic>
Functions of <stdatomic> Header
Below is list of all functions from <stdatomic> header.
Path Manipulation Functions
This path manipulation functions operate on file paths to compose, convert or resolve them.
| S.No | Functions & Description |
|---|---|
| 1 | atomic_is_lock_free
This function checks if the atomic type's operations are lock-free. |
| 2 | atomic_store, atomic_store_explicit
These functions atomically replaces the value of the atomic object with a non-atomic argument. |
| 3 | atomic_exchange, atomic_exchange_explicit
These functions atomically replaces the value of the atomic object with non-atomic argument and returns the old value of the atomic. |
| 4 | atomic_fetch_add, atomic_fetch_add_explicit
These functions adds a non-atomic value to an atomic object and obtains the previous value of the atomic. |
| 5 | atomic_fetch_sub, atomic_fetch_sub_explicit
These functions replaces the atomic object with the result of bitwise AND with a non-atomic argument and obtains the previous value of the atomic. |
| 6 | atomic_fetch_or, atomic_fetch_or_explict
These functions replaces the atomic object with the result of bitwise OR with a non-atomic argument and obtains the previous value of the atomic. |
| 7 | atomic_fetch_xor, atomic_fetch_xor_explict
These functions replaces the atomic object with the result of bitwise XOR with a non-atomic argument and obtains the previous value of the atomic. |
| 8 | atomic_flag_test_and_set, atomic_flag_test_and_set_explicit
These functions atomically sets the value of the flag to false. |
| 9 | atomic_thread_fence
This function provides generic memory order-dependent fence synchronization primitive. |
| 10 | atomic_signal_fence
This function fence between a thread and a signal handler executed in the same thread. |
Checking if Operations are Lock-Free
In the below example we are going to use, atomic_is_lock_free to check if atomic operations on a specific atomic type are lock-free.
#include <iostream>
#include <atomic>
int main() {
std::atomic<int> atomicInt;
bool isLockFree = atomic_is_lock_free(&atomicInt);
std::cout << "Is atomic operation lock-free? " << std::boolalpha << isLockFree << std::endl;
return 0;
}
Output
If we run the above code it will generate the following output
Is atomic operation lock-free? true