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 desde C++26)
atomic_ref ( const atomic_ref & ref ) noexcept ;
(2) (constexpr desde C++26)

Construye un nuevo objeto atomic_ref .

1) Construye un objeto atomic_ref que referencia al objeto obj .
Si obj no está alineado con required_alignment , el comportamiento es indefinido.
2) Construye un objeto atomic_ref que referencia al objeto referenciado por ref .

Parámetros

obj - objeto a referenciar
ref - otro objeto atomic_ref desde el cual copiar

Ejemplo

El programa incrementa los valores en un contenedor usando varios hilos. Luego se imprime la suma final. El acceso no atómico puede "perder" los resultados de algunas operaciones debido a carreras de datos.

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

Salida posible:

sum = 40000000
sum = 39994973