std::atomic_ref<T>::atomic_ref
From cppreference.com
 
 
 < cpp | atomic | atomic ref 
 
 
 C++ 
 Feature test macros (C++20)
 Concepts library (C++20)
 Metaprogramming library (C++11)
 Ranges library (C++20)
 Filesystem library (C++17)
 Concurrency support library (C++11)
 Execution control library (C++26)
Concurrency support library 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(C++11)
(C++20)
(C++11)
(C++11)
(C++20)
(C++26)
(C++26)
(C++20)
(C++26)
  (C++20)
(C++26)
(C++26)
(C++26)
(C++26)
(C++26)
(C++26)
  (C++11)
(C++11)
(C++17)
(C++11)
(C++14)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)(C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++26)
(C++26)
(C++26)
(C++11)
(C++20)
(C++11)
(C++11)(deprecated in C++20)
(C++11)(deprecated in C++20)
(C++11)
(C++11)
(C++11)(deprecated in C++26)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)
(C++26)(C++26)
(C++26)(C++26)
(C++11)
(C++20)(C++20)
(C++20)
(C++20)
(C++11)(C++11)
(C++11)(C++11)
(C++20)(C++20)
(C++20)(C++20)
(C++20)
(C++20)
std::atomic_ref 
 
 
 
 
atomic_ref::atomic_ref
(C++26)
(C++26)
(C++26)
explicit atomic_ref( T& obj );
 (1)
 (constexpr since C++26)
atomic_ref( const atomic_ref& ref ) noexcept;
 (2)
 (constexpr since C++26)
Constructs a new atomic_ref object.
1) Constructs an 
atomic_ref object referencing the object obj. If obj is not aligned to 
required_alignment, the behavior is undefined.2) Constructs an 
atomic_ref object referencing the object referenced by ref.[edit] Parameters
 obj
 -
 object to reference
 ref
 -
 another 
atomic_ref object to copy from
[edit] Example
The program increments the values in a container using several threads. Then the final sum is printed. Non-atomic access may "loss" the results of some operations due to data-races.
Run this code
#include <atomic> #include <iostream> #include <numeric> #include <thread> #include <vector> int main() { using Data = std::vector <char>; auto inc_atomically = [](Data& data) { for (Data::value_type& x : data) { auto xx = std::atomic_ref <Data::value_type>(x); ++xx; // atomic read-modify-write } }; auto inc_directly = [](Data& data) { for (Data::value_type& x : data) ++x; }; auto test_run = [](const auto Fun) { Data data(10'000'000); { std::jthread j1{Fun, std::ref (data)}; std::jthread j2{Fun, std::ref (data)}; std::jthread j3{Fun, std::ref (data)}; std::jthread j4{Fun, std::ref (data)}; } std::cout << "sum = " << std::accumulate (cbegin(data), cend(data), 0) << '\n'; }; test_run(inc_atomically); test_run(inc_directly); }
Possible output:
sum = 40000000 sum = 39994973