Я искал способ остановить поток, который выполняет задачу каждые 2 секунды.Я решил попробовать использовать std :: обещание / будущее, чтобы поток мог сразу же завершиться, когда задано обещание.
#include <future>
#include <iostream>
#include <chrono>
#include <csignal>
std::promise<void> stop;
int main() {
std::signal(SIGINT, [] (int) { stop.set_value(); } );
auto future = stop.get_future();
while (future.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {
std::cout << "I'm still there" << std::endl;
}
}
На самом деле это не работает и аварийно завершает работу таким образом:
$ ./a.out Я все еще там ^ Cterminate вызывается после создания экземпляра 'std :: system_error'
what (): Неизвестная ошибка -1 Отказаться (ядро выгружено)
Хорошо, нужно позаботиться о том, что он делает в контексте обработчика, но я должен сказать, что не ожидал этого сбоя;и я не очень понимаю это ... У тебя есть идеи?