Sincronizarea grupurilor de thread-uri prin mecanisme tradiționale (combinații de std::mutex și std::condition_variable) presupune mult cod predispus la blocaje (race conditions) și un overhead substanțial de sistem de operare. C++20 introduce două primitive hardware de înaltă eficiență:
- std::latch: Un contor de sincronizare descrescător de unică folosință (single-use). Când contorul ajunge la zero, toate thread-urile blocate în
wait()sunt eliberate instantaneu. - std::barrier: O barieră ciclică reutilizabilă (multi-phase). Un grup de thread-uri lucrează în etape paralele; la finalul fiecărei etape, toate thread-urile se așteaptă reciproc, se execută o funcție de callback de finalizare, iar bariera se resetează automat pentru runda următoare.
Coordonarea thread-urilor cu std::latch
#include <latch>
#include <thread>
#include <vector>
#include <print>
int main() {
constexpr int NUMAR_WORKERS = 4;
// Latch inițializat cu 4:
std::latch startSemnal(NUMAR_WORKERS);
std::vector<std::jthread> workers;
for (int i = 0; i < NUMAR_WORKERS; ++i) {
workers.emplace_back([&startSemnal, i]() {
std::println("Worker-ul {} s-a initializat.", i);
// Fiecare worker scade contorul și așteaptă ca toți ceilalți să fie gata:
startSemnal.arrive_and_wait();
std::println("Worker-ul {} a inceput procesarea paralela!", i);
});
}
return 0;
}
Întrebări & Exemple de Cod:
Sincronizarea Multithreading a Firelor de Execuție cu std::latch și std::barrier în C++20Ai o nelămurire despre utilizarea comenzii
Sincronizarea Multithreading a Firelor de Execuție cu std::latch și std::barrier în C++20sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.