GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::atomic::fetch_add(3) C++ Standard Libary std::atomic::fetch_add(3)

std::atomic::fetch_add - std::atomic::fetch_add


member only of atomic<Integral>(C++11) and atomic<Floating>(C++20)
template specializations
T fetch_add( T arg,
std::memory_order order = std::memory_order_seq_cst ) noexcept;
T fetch_add( T arg,
std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;
member only of atomic<T*> template specialization (1)
T* fetch_add( std::ptrdiff_t arg,
std::memory_order order = std::memory_order_seq_cst ) noexcept; (2)
T* fetch_add( std::ptrdiff_t arg,
std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;


Atomically replaces the current value with the result of arithmetic addition of the
value and arg. That is, it performs atomic post-increment. The operation is
read-modify-write operation. Memory is affected according to the value of order.


For signed Integral types, arithmetic is defined to use two’s complement
representation. There are no undefined results.


For T* types, the result may be an undefined address, but the operation otherwise
has no undefined behavior. The program is ill-formed if T is not an object type.


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
traits but is encouraged to do so. If the result is not a
representable value for its type, the result is unspecified but the (since C++20)
operation otherwise has no undefined behavior.


The volatile-qualified versions are deprecated if
std::atomic<T>::is_always_lock_free is false.


arg - the other argument of arithmetic addition
order - memory order constraints to enforce


The value immediately preceding the effects of this function in the modification
order of *this.

// Run this code


#include <iostream>
#include <thread>
#include <atomic>
#include <array>


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;
}
}


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.


DR Applied to Behavior as published Correct behavior
P0558R1 C++11 arithmetic permitted on pointers to cv void or made ill-formed
function


atomic_fetch_add adds a non-atomic value to an atomic object and obtains
atomic_fetch_add_explicit the previous value of the atomic
(C++11) (function template)
(C++11)
operator++
operator++(int) increments or decrements the atomic value by one
operator-- (public member function)
operator--(int)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.