Înainte de C++20, dacă doreați să actualizați concurent un număr dintr-un vector partajat între mai multe fire de execuție, erați forțat să declarați întregul vector ca std::vector<std::atomic<int>>. Această constrângere făcea vectorul ne-copiabil și introducea overhead inutil în etapele mono-thread. Șablonul std::atomic_ref<T> din C++20 permite crearea temporară a unei referințe atomice peste un obiect non-atomic obișnuit, executând operațiuni hardware atomice (Fetch-and-Add, Compare-and-Swap) direct pe adresa de memorie a acestuia.
#include <atomic>
#include <vector>
#include <thread>
#include <print>
int main() {
// Un vector standard de întregi obișnuiți (non-atomici):
std::vector<int> contoare(4, 0);
auto incrementeaza = [&contoare](size_t index) {
// Creăm o referință atomică temporară peste elementul din vector:
std::atomic_ref<int> ref(contoare[index]);
for (int i = 0; i < 100'000; ++i) {
ref.fetch_add(1, std::memory_order_relaxed);
}
};
// Lansăm două thread-uri concurente care concurează pe contoare[0]:
std::jthread t1(incrementeaza, 0);
std::jthread t2(incrementeaza, 0);
t1.join();
t2.join();
std::println("Valoare finala contor[0]: {} (asteptat: 200000)", contoare[0]);
return 0;
}