Namespaces
Variants

std::atomic_ref<T>:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
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
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
explicit atomic_ref ( T & obj ) ;
(1) (constexpr depuis C++26)
atomic_ref ( const atomic_ref & ref ) noexcept ;
(2) (constexpr depuis C++26)

Construit un nouvel objet atomic_ref .

1) Construit un objet atomic_ref référençant l'objet obj .
Si obj n'est pas aligné sur required_alignment , le comportement est indéfini.
2) Construit un objet atomic_ref référençant l'objet pointé par ref .

Paramètres

obj - objet à référencer
ref - autre atomic_ref objet à copier

Exemple

Le programme incrémente les valeurs dans un conteneur en utilisant plusieurs threads. Ensuite, la somme finale est affichée. Un accès non atomique peut "perdre" les résultats de certaines opérations en raison de courses aux données.

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

Sortie possible :

sum = 40000000
sum = 39994973