
- 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::fetch_and() function
The C++ std::atomic::fetch_and() function is used to perform an atomic bitwise AND operation on the value of an atomic object. It modifies the atomic variable by applying a bitwise AND with the given argument, ensuring thread safety without using the locks. It returns the original value before the operation.
Syntax
Following is the syntax for std::atomic::fetch_and() function.
T fetch_and (T val, memory_order sync = memory_order_seq_cst) volatile noexcept; T fetch_and (T val, memory_order sync = memory_order_seq_cst) noexcept;
Parameters
- val − It indicates the value to apply.
- sync − It indicates the synchronization mode for the operation.
Return Value
This function returns the contained value before the call.
Exceptions
This function never throws exceptions.
Example
In the following example, we are going to consider the basic usage of fetch_and() function.
#include <iostream> #include <atomic> int main() { std::atomic<int> x(0b1100); int y = x.fetch_and(0b1010); std::cout << "Original value: " << y << std::endl; std::cout << "New value: " << x.load() << std::endl; return 0; }
Output
Output of the above code is as follows −
Original value: 12 New value: 8
Example
Consider the following example, where we are going to use multiple fetch_and() and observing the output.
#include <iostream> #include <atomic> int main() { std::atomic<int> x(0b00110); int a = x.fetch_and(0b10011); int b = x.fetch_and(0b10000); std::cout << "Result after first fetch_and: " << a << std::endl; std::cout << "Result after second fetch_and: " << b << std::endl; std::cout << "Final value: " << x.load() << std::endl; return 0; }
Output
If we run the above code it will generate the following output −
Result after first fetch_and: 6 Result after second fetch_and: 2 Final value: 0
Example
Let's look at the following example, where we are going to use the fetch_and() with std::memory_order_relaxed.
#include <iostream> #include <atomic> #include <thread> std::atomic<int> x(0b0101); void a() { int b = x.fetch_and(0b0100, std::memory_order_relaxed); std::cout << "Old value: " << b << ", New value: " << x.load() << '\n'; } int main() { std::thread t1(a); t1.join(); return 0; }
Output
Following is the output of the above code −
Old value: 5, New value: 4