std::atomic_ref<T>:: atomic_ref
From cppreference.net
<
cpp
|
atomic
|
atomic ref
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::atomic_ref
| Member functions | ||||
|
atomic_ref::atomic_ref
|
||||
|
(C++26)
|
||||
|
Operations for arithmetic types
(except
bool
and pointer-to-object)
|
||||
|
Operations for integral types
(except
bool
and pointer-to-object)
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
|
Operations for integral types
(except
bool
)
|
||||
| Constants | ||||
|
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
.
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.
Exécuter ce 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); }
Sortie possible :
sum = 40000000 sum = 39994973