Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::atomic::fetch_add(3)     C++ Standard Libary    std::atomic::fetch_add(3)

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

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

			std::memory_order		 order		     =
       (3) (since C++11)

			    std::memory_order_seq_cst )	noexcept;
	  T* fetch_add(	std::ptrdiff_t arg,

			std::memory_order		order		     =
       (4) (since C++11)

			    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 oper-
       ation is	a
	  read-modify-write operation. Memory is  affected  according  to  the
       value of	order.

	  1,2)	For  signed  integral types, arithmetic	is defined to use twos
       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.

	  3,4)	The result may be an undefined address,	but the	operation oth-
       erwise has no
	  undefined behavior.
	  If T is not a	complete object	type, the program is ill-formed.

	  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.

Example
       // Run this code

	#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 retroac-
       tively to
	  previously published C++ standards.

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

See also
	  atomic_fetch_add	     adds  a non-atomic	value to an atomic ob-
       ject 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)

http://cppreference.com		  2024.06.10	     std::atomic::fetch_add(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::atomic::fetch_add&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help