|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
explicit atomic_ref( T& obj); | (1) | (constexpr since C++26) |
atomic_ref(const atomic_ref& ref)noexcept; | (2) | (constexpr since C++26) |
Constructs a newatomic_ref object.
atomic_ref object referencing the objectobj.required_alignment, the behavior is undefined.atomic_ref object referencing the object referenced byref.| obj | - | object to reference |
| ref | - | anotheratomic_ref object to copy from |
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=[](constauto 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 = 40000000sum = 39994973