LINUX.ORG.RU

История изменений

Исправление 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, мы просто чекаем в самом «сердце» зацикенной логики и не паримся о деталях. Конечно это вариация на тему «проверка флага», но это удобней топорной реализации.