Совместное управление остановкой
std::jthread появился в C++20 и упрощает управление временем жизни потока: его деструктор запрашивает остановку и присоединяет поток. Поток должен сам проверять запрос и завершать работу безопасно; это кооперативная остановка, а не принудительное прерывание.
#include <chrono>
#include <thread>
using namespace std::chrono_literals;
std::jthread worker([](std::stop_token stop) {
while (!stop.stop_requested()) {
doOneStep();
std::this_thread::sleep_for(100ms);
}
});
// При выходе из области worker запросит остановку и join.Передача std::stop_token в функцию потока позволяет проверять запрос в контрольных точках. Для ожидания с возможностью прерывания используйте std::condition_variable_any с токеном либо отдельный механизм уведомления: обычный долгий сон не проснётся мгновенно только от запроса stop.
Не захватывайте ссылки на объекты, которые могут завершить жизнь раньше потока. Деструктор jthread блокируется на join(), поэтому уничтожайте его вне критического участка, где присоединение могло бы привести к взаимной блокировке.