std::thread::hardware_concurrency în C++

Returnează câte fire pot rula cu adevărat în paralel pe acest calculator (de obicei numărul de nuclee logice).

Sintaxă
static unsigned int hardware_concurrency() noexcept;

Ce face std::thread::hardware_concurrency

std::thread::hardware_concurrency() returnează o estimare a numărului de fire care pot rula simultan, de obicei numărul de nuclee logice ale procesorului. Este un bun punct de pornire pentru câte fire de lucru să creezi.

Poate returna 0 dacă informația nu este disponibilă, așa că tratează acest caz. Valoarea depinde de calculator, deci rezultatele de mai jos sunt doar un exemplu.

Ce returnează

Un unsigned int: numărul de fire hardware, sau 0 dacă nu se știe.

Exemple

Exemplul 1: Câte fire să pornesc?

#include <algorithm>
#include <print>
#include <thread>

int main() {
    unsigned n = std::thread::hardware_concurrency();
    std::println("Nuclee logice: {}", n);

    unsigned fire = std::max(1u, n);   // 0 înseamnă „necunoscut”
    std::println("Voi folosi {} fire de lucru", fire);
}

Rezultat posibil (diferă la fiecare rulare)

Nuclee logice: 10
Voi folosi 10 fire de lucru

Greșeli frecvente

  • Împarți lucrul la hardware_concurrency() fără să verifici 0. Obții împărțire la zero.
  • Pornești mult mai multe fire decât nuclee pentru calcule intense. Nu merge mai repede, ci mai încet, din cauza comutării între fire.

Comenzi înrudite

  • std::thread: Pornește o funcție pe un fir de execuție separat, care rulează în paralel cu restul programului.
  • std::async: Rulează o funcție (de obicei pe alt fir) și îți dă un std::future din care iei rezultatul mai târziu.
  • std::this_thread::get_id: Returnează identificatorul firului de execuție curent (std::thread::id).