std::atomic::fetch_add(3)
π std::atomic::fetch_add π
okay bestie, welcome to the std::atomic::fetch_add page from the C++ Standard Libary manual π
. It's giving βatomic math but make it read-modify-write,β and honestly? main character energy β¨.
πΈ NAME πΈ
std::atomic::fetch_add - std::atomic::fetch_add
β¨ Synopsis β¨
okay so here are the overloads, fr fr. The first two are member only of atomic<Integral > specializations and atomic<Floating > specializations (since C++20):
- (1) (since C++11) β
T fetch_add( T arg, std::memory_order order = std::memory_order_seq_cst ) noexcept; - (2) (since C++11) β
T fetch_add( T arg, std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;
and these next two are member only of atomic<T*> partial specialization:
- (3) (since C++11) β
T* fetch_add( std::ptrdiff_t arg, std::memory_order order = std::memory_order_seq_cst ) noexcept; - (4) (since C++11) β
T* fetch_add( std::ptrdiff_t arg, std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;
It atomically replaces the current value with the result of arithmetic addition of the value and arg. That is, it performs an atomic post-increment π«Ά. The operation is a read-modify-write operation, and memory is affected according to the value of order.
For 1, 2:
- For signed integral types, arithmetic is defined to use twoβs complement representation. There are no undefined results.
- For floating-point types, the floating-point environment in effect may be different from the calling thread's floating-point environment. The operation need not conform to the corresponding
std::numeric_limits(since C++20) traits but is encouraged to do so. If the result is not a representable value for its type, the result is unspecified but the operation otherwise has no undefined behavior.
For 3, 4:
- The result may be an undefined address, but the operation otherwise has no undefined behavior.
- If
Tis not a complete object type, the program is ill-formed.
π¨ deprecated vibes: it is deprecated if std::atomic<T>::is_always_lock_free is false and (since C++20) overload (2) or (4) participates in overload resolution.
π Parameters π
argβ the other argument of arithmetic addition.orderβ memory order constraints to enforce.
π« Return value π«
The value immediately preceding the effects of this function in the modification order of *this. periodt π
π₯ Example π₯
There's a // Run this code link vibe; the code is exactly this:
#include <array>
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<long long> data{10};
std::array<long long, 5> return_values{};
void do_work(int thread_num)
{
long long val = data.fetch_add(1, std::memory_order_relaxed);
return_values[thread_num] = val;
}
int main()
{
{
std::jthread th0{do_work, 0};
std::jthread th1{do_work, 1};
std::jthread th2{do_work, 2};
std::jthread th3{do_work, 3};
std::jthread th4{do_work, 4};
}
std::cout << "Result : " << data << '\n';
for (long long val : return_values)
std::cout << "Seen return value : " << val << std::endl;
}
π Possible output π
Result : 15
Seen return value : 11
Seen return value : 10
Seen return value : 14
Seen return value : 12
Seen return value : 13
π©Ή Defect reports π©Ή
The following behavior-changing defect reports were applied retroactively to previously published C++ standards:
P0558R1β applied to C++11. Behavior as published: arithmetic permitted on pointers to (possibly cv-qualified)voidor function. Correct behavior: made ill-formed.
π See also π
atomic_fetch_add,atomic_fetch_add_explicit(C++11) (C++11) β function template that adds a non-atomic value to an atomic object and obtains the previous value of the atomic.operator++,operator++(int),operator--,operator--(int)β public member function that increments or decrements the atomic value by one.
source/version + date, bb: http://cppreference.com Β· 2024.06.10 Β· std::atomic::fetch_add(3) β mwah π stay atomic β¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms