std::atomic_ref::atomic_ref - cppreference.com (original) (raw)

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.

  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.

#include #include #include #include #include   int main() { using Data = std::vector;   auto inc_atomically = [](Data& data) { for (Data::value_type& x : data) { auto xx = std::atomic_refData::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