Функция this_thread::yield
Функция this_thread::yield дает планировщику операционной системы подсказку о том, что текущий поток готов уступить свое процессорное время. Это позволяет другим потокам, которые ожидают выполнения, получить шанс на исполнение. Функция не принимает параметров и не возвращает значения. Она полезна в ситуациях, когда поток выполняет длительную операцию ожидания в цикле, и вы хотите избежать монополизации процессора.
Синтаксис
#include <thread>
void this_thread::yield();
Функция объявлена в пространстве имен std::this_thread и доступна при подключении заголовочного файла <thread>.
Пример
Рассмотрим простой пример, где один поток активно выполняется в цикле, а второй поток также пытается выполнять работу. Без вызова yield первый поток может занять все процессорное время:
#include <iostream>
#include <thread>
using namespace std;
void worker(int id)
{
for (int i = 0; i < 3; i++)
{
cout << "Thread " << id << " is working" << endl;
this_thread::yield();
}
}
int main()
{
thread t1(worker, 1);
thread t2(worker, 2);
t1.join();
t2.join();
return 0;
}
Возможный результат выполнения кода:
Thread 1 is working
Thread 2 is working
Thread 1 is working
Thread 2 is working
Thread 1 is working
Thread 2 is working
Пример
Функция yield часто используется в циклах ожидания, когда поток проверяет некоторое условие. Вместо того чтобы постоянно занимать процессор, поток уступает время другим задачам:
#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
atomic<bool> ready(false);
void waiter()
{
while (!ready.load())
{
this_thread::yield();
}
cout << "Waiter: condition met" << endl;
}
void setter()
{
this_thread::sleep_for(chrono::milliseconds(100));
ready.store(true);
cout << "Setter: flag is set" << endl;
}
int main()
{
thread t1(waiter);
thread t2(setter);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"Setter: flag is set"
"Waiter: condition met"
Смотрите также
-
класс
thread,
который представляет собой отдельный поток выполнения -
функция
this_thread::sleep_for,
которая приостанавливает поток на заданный промежуток времени -
функция
this_thread::sleep_until,
которая приостанавливает поток до указанного момента времени -
метод
join,
который ожидает завершения потока