
- C++ Library - Home
- C++ Library - <fstream>
- C++ Library - <iomanip>
- C++ Library - <ios>
- C++ Library - <iosfwd>
- C++ Library - <iostream>
- C++ Library - <istream>
- C++ Library - <ostream>
- C++ Library - <sstream>
- C++ Library - <streambuf>
- C++ Library - <atomic>
- C++ Library - <complex>
- C++ Library - <exception>
- C++ Library - <functional>
- C++ Library - <limits>
- C++ Library - <locale>
- C++ Library - <memory>
- C++ Library - <new>
- C++ Library - <numeric>
- C++ Library - <regex>
- C++ Library - <stdexcept>
- C++ Library - <string>
- C++ Library - <thread>
- C++ Library - <tuple>
- C++ Library - <typeinfo>
- C++ Library - <utility>
- C++ Library - <valarray>
- The C++ STL Library
- C++ Library - <array>
- C++ Library - <bitset>
- C++ Library - <deque>
- C++ Library - <forward_list>
- C++ Library - <list>
- C++ Library - <map>
- C++ Library - <multimap>
- C++ Library - <queue>
- C++ Library - <priority_queue>
- C++ Library - <set>
- C++ Library - <stack>
- C++ Library - <unordered_map>
- C++ Library - <unordered_set>
- C++ Library - <vector>
- C++ Library - <algorithm>
- C++ Library - <iterator>
- The C++ Advanced Library
- C++ Library - <any>
- C++ Library - <barrier>
- C++ Library - <bit>
- C++ Library - <chrono>
- C++ Library - <cinttypes>
- C++ Library - <clocale>
- C++ Library - <condition_variable>
- C++ Library - <coroutine>
- C++ Library - <cstdlib>
- C++ Library - <cstring>
- C++ Library - <cuchar>
- C++ Library - <charconv>
- C++ Library - <cfenv>
- C++ Library - <cmath>
- C++ Library - <ccomplex>
- C++ Library - <expected>
- C++ Library - <format>
- C++ Library - <future>
- C++ Library - <flat_set>
- C++ Library - <flat_map>
- C++ Library - <filesystem>
- C++ Library - <generator>
- C++ Library - <initializer_list>
- C++ Library - <latch>
- C++ Library - <memory_resource>
- C++ Library - <mutex>
- C++ Library - <mdspan>
- C++ Library - <optional>
- C++ Library - <print>
- C++ Library - <ratio>
- C++ Library - <scoped_allocator>
- C++ Library - <semaphore>
- C++ Library - <source_location>
- C++ Library - <span>
- C++ Library - <spanstream>
- C++ Library - <stacktrace>
- C++ Library - <stop_token>
- C++ Library - <syncstream>
- C++ Library - <system_error>
- C++ Library - <string_view>
- C++ Library - <stdatomic>
- C++ Library - <variant>
- C++ STL Library Cheat Sheet
- C++ STL - Cheat Sheet
- C++ Programming Resources
- C++ Programming Tutorial
- C++ Useful Resources
- C++ Discussion
C++ Atomic::exchange() function
The C++ std::atomic::exchange() function is used to automatically replace the value of an atomic object with a new value and return the old value. This function is essential in multithreading contexts where you need to ensure that the read-write modification operation on a variable is done atomically, preventing data races.
Syntax
Following is the syntax for std::atomic::exchange() function.
T exchange (T val, memory_order sync = memory_order_seq_cst) volatile noexcept; T exchange (T val, memory_order sync = memory_order_seq_cst) noexcept;
Parameters
- val − It indicates the value to copy to the contained object.
- sync It indicates the synchronization mode for the operation.
Return Value
It returns the value of the atomic variable before the call.
Exceptions
This member function never throws exceptions.
Example
In the following example, we are going to consider the basic usage of exchange() function.
#include <iostream> #include <atomic> int main() { std::atomic<int> a(10); int x = a.exchange(20); std::cout << "Old value: " << x << std::endl; std::cout << "New value: " << a.load() << std::endl; return 0; }
Output
Output of the above code is as follows −
Old value: 10 New value: 20
Example
Consider the following example, where we are going to perform the atomic exchange using the pointers.
#include <iostream> #include <atomic> int main() { char a = 'A', b = 'B'; std::atomic<char*> x(&a); char* y = x.exchange(&b); std::cout << "Old pointer value: " << *y << std::endl; std::cout << "New pointer value: " << *x << std::endl; return 0; }
Output
Following is the output of the above code −
Old pointer value: A New pointer value: B
Example
In the following example, we are going to perform the atomic exchange in a multithreaded context.
#include <iostream> #include <atomic> #include <thread> std::atomic<int> x(11); void a() { int y = x.exchange(22); std::cout << "Old value: " << y << std::endl; } int main() { std::thread t(a); t.join(); std::cout << "New value: " << x << std::endl; return 0; }
Output
If we run the above code it will generate the following output −
Old value: 11 New value: 22