std::this_thread::sleep_for în C++

Oprește firul de execuție curent pentru (cel puțin) durata dată.

Sintaxă
#include <thread>
template<class Rep, class Period>
void sleep_for(const std::chrono::duration<Rep, Period>& durata);

Ce face std::this_thread::sleep_for

std::this_thread::sleep_for(500ms) suspendă firul curent cel puțin 500 de milisecunde; poate dura puțin mai mult, în funcție de sistemul de operare. Celelalte fire continuă să ruleze.

Durata se dă cu tipurile din <chrono> (std::chrono::seconds(2)) sau cu literali (2s, 100ms, după using namespace std::chrono_literals;). Varianta sleep_until așteaptă până la un anumit moment.

Parametri

Parametru Descriere
durata Cât timp doarme firul.

Ce returnează

Nimic.

Exemple

Exemplul 1: O numărătoare inversă

Programul durează aproximativ 300 ms; textul afișat este același la fiecare rulare.

#include <chrono>
#include <print>
#include <thread>

int main() {
    using namespace std::chrono_literals;
    for (int i = 3; i > 0; --i) {
        std::println("{}...", i);
        std::this_thread::sleep_for(100ms);
    }
    std::println("Start!");
}

Rezultat

3...
2...
1...
Start!

Exemplul 2: Cât a dormit de fapt

Firul doarme cel puțin cât i s-a cerut; valoarea exactă diferă la fiecare rulare.

#include <chrono>
#include <print>
#include <thread>

int main() {
    using namespace std::chrono;
    auto inceput = steady_clock::now();
    std::this_thread::sleep_for(milliseconds(200));
    auto durata = duration_cast<microseconds>(steady_clock::now() - inceput);
    std::println("Am cerut 200ms, am dormit {}", durata);
}

Rezultat posibil (diferă la fiecare rulare)

Am cerut 200ms, am dormit 201273µs

Greșeli frecvente

  • Folosești sleep_for ca să „aștepți” alt fir (de exemplu dormi 1 secundă și speri că firul a terminat). Este fragil; folosește join, std::future sau std::condition_variable.
  • Scrii sleep_for(500) cu un număr simplu. Nu compilează: parametrul trebuie să fie o durată (500ms).

Comenzi înrudite

  • std::chrono::duration: O durată de timp cu unitate de măsură: secunde, milisecunde, minute, ore. Conversiile sunt automate și sigure.
  • std::thread: Pornește o funcție pe un fir de execuție separat, care rulează în paralel cu restul programului.
  • std::condition_variable: Permite unui fir să aștepte, fără să consume procesor, până când alt fir îl anunță că o condiție s-a îndeplinit.