Опрос и блокировка основного потока 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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