Класс jthread
Класс jthread (joining thread) был добавлен в C++20 и представляет
собой улучшенную версию класса thread. Его главное отличие
заключается в том, что при разрушении объекта jthread автоматически
вызывается метод join, если поток еще не был присоединен или отсоединен.
Это избавляет программиста от необходимости вручную управлять временем жизни
потока и предотвращает аварийное завершение программы. Кроме того,
jthread поддерживает встроенный механизм запроса остановки через
std::stop_token, который позволяет корректно сигнализировать потоку
о необходимости завершить работу.
Конструктор класса принимает вызываемый объект (функцию, лямбду или
функтор), который будет выполнен в новом потоке. В качестве дополнительных
аргументов можно передать параметры для этого вызываемого объекта. Также
jthread может принимать stop_token первым аргументом, если
вызываемый объект ожидает его для проверки запроса остановки.
Синтаксис
#include <thread>
std::jthread name(function, args...);
std::jthread name;
Пример
Давайте создадим простой поток с помощью jthread и выполним
в нем вывод чисел:
#include <iostream>
#include <thread>
using namespace std;
void printNumbers()
{
for (int i = 1; i <= 5; i++) {
cout << i << " ";
}
cout << endl;
}
int main()
{
jthread th(printNumbers);
// При разрушении th автоматически вызовется join
return 0;
}
Результат выполнения кода:
1 2 3 4 5
Пример
Давайте рассмотрим использование stop_token для корректной
остановки потока. Поток будет выполняться до тех пор, пока не поступит
запрос на остановку:
#include <iostream>
#include <thread>
using namespace std;
void worker(stop_token token)
{
int i = 1;
while (!token.stop_requested()) {
cout << i << " ";
i++;
}
cout << endl << "Stopped" << endl;
}
int main()
{
jthread th(worker);
th.request_stop();
return 0;
}
Результат выполнения кода:
1
"Stopped"
Смотрите также
-
класс
thread,
который представляет собой базовый класс для работы с потоками -
метод
request_stop,
который запрашивает остановку выполнения потока -
метод
join,
который ожидает завершения выполнения потока -
метод
detach,
который отсоединяет поток от объекта