История изменений
Исправление
kvpfs,
(текущая версия)
:
Какого-то автоматического способа не знаю, но, по-моему, удобно заюзать исключения
#include <thread>
#include <atomic>
#include <chrono>
using namespace std;
using namespace std::chrono;
std::atomic_flag stop;
struct Completion_exc {};
void check_flag() {
if (stop.test())
throw Completion_exc{};
}
void thread_fn() try
{
while (true)
while (true)
while (true) {
this_thread::sleep_for(1s);
check_flag();
}
}
catch (Completion_exc &) {}
int main() {
jthread t(thread_fn);
this_thread::sleep_for(1s);
stop.test_and_set();
}
Удобство в том, что не надо вкостыливать вереницу проверок флага в каждом внешнем блоке вроде старшего while, мы просто чекаем в самом «сердце» зацикенной логики и не паримся о деталях. Конечно это вариация на тему «проверка флага», но это удобней топорной реализации.
PS: вместо atomic_flag лучше заюзать std::stop_token, его можно передавать в std’шные wait функции.
Исходная версия
kvpfs,
:
Какого-то автоматического способа не знаю, но, по-моему, удобно заюзать исключения
#include <thread>
#include <atomic>
#include <chrono>
using namespace std;
using namespace std::chrono;
std::atomic_flag stop;
struct Completion_exc {};
void check_flag() {
if (stop.test())
throw Completion_exc{};
}
void thread_fn() try
{
while (true)
while (true)
while (true) {
this_thread::sleep_for(1s);
check_flag();
}
}
catch (Completion_exc &) {}
int main() {
jthread t(thread_fn);
this_thread::sleep_for(1s);
stop.test_and_set();
}
Удобство в том, что не надо вкостыливать вереницу проверок флага в каждом внешнем блоке вроде старшего while, мы просто чекаем в самом «сердце» зацикенной логики и не паримся о деталях. Конечно это вариация на тему «проверка флага», но это удобней топорной реализации.