Namespaces
Variants
Views
Actions

std::atomic_ref<T>::atomic_ref

From cppreference.com
< cpp‎ | atomic‎ | atomic ref
Revision as of 23:16, 18 August 2023 by Andreas Krug (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
 
 
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
Generic lock management
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Safe Reclamation
(C++26)
Hazard Pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11)(deprecated in C++20)
(C++11)(deprecated in C++20)
Memory ordering
Free functions for atomic operations
Free functions for atomic flags
 
 
explicit atomic_ref( T& obj );
(1) (since C++20)
atomic_ref( const atomic_ref& ref ) noexcept;
(2) (since C++20)

Constructs a new atomic_ref object.

1) Constructs an atomic_ref object referencing the object obj. The behavior is undefined if obj is not aligned to required_alignment.
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 <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