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>(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 noex-
       cept;
	  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 noex-
       cept;

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

	  For signed Integral types, arithmetic	is defined to use twos comple-
       ment
	  representation. There	are no undefined results.

	  For T* types,	the result may be an undefined address,	but the	opera-
       tion 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.

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

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 cv void or
       made ill-formed
			     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		  2022.07.31	     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.0>

home | help