Опрос и блокировка основного потока C++, завершение по сигналуC++

Программы на C++. Форум разработчиков
Anonymous
Опрос и блокировка основного потока C++, завершение по сигналу

Сообщение Anonymous »

У меня есть основной поток, который должен выполнять некоторую работу каждые N секунд (в данном случае 20) и между ними ждать/блокировать/приостанавливать работу. Однако в то же время я хочу, чтобы приложение правильно останавливалось на SIGTERM/SIGINT, чтобы оставаться ответственным.
Текущая идея у меня следующая: https://godbolt.org/ z/73rsnqozW

Код: Выделить всё

std::binary_semaphore P_SEM{0};

void signal_handler(int signal) {
P_SEM.release();
}

using namespace std::chrono_literals;

int main() {

std::atomic shutdown(false);
std::mutex cv_m;
std::condition_variable cv;

std::signal(SIGINT, signal_handler);
std::signal(SIGTERM, signal_handler);

auto termination_handler = [&shutdown, &cv]() {
P_SEM.acquire();
shutdown.store(true);
cv.notify_all();
};

auto t_termination_handler = std::async(std::launch::async, termination_handler);

do {
//work polling-loop
//do work here every 20 seconds
std::unique_lock lk(cv_m);
cv.wait_for(lk, 20s);
} while(!shutdown);
return 0;
}
Это 1) правильно и 2) слишком сложно? Я не уверен, что именно я могу безопасно сделать в обработчике сигнала, я знаю, что освобождение семафора должно быть безопасным.
Ура и спасибо

Подробнее здесь: https://stackoverflow.com/questions/787 ... -on-signal

Вернуться в «C++»