我一直在寻找一种方法来停止每2秒执行一次任务的线程。我决定尝试使用std :: promise / future,以便在设置promise时线程可以立即退出。
#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我还在 ^抛出'std :: system_error'实例后调用终止 what():未知错误-1放弃 (核心已丢弃)
好吧,一个人应该照顾他在处理程序上下文中所做的事情,但是我必须说我没想到会发生崩溃。我不太了解... 你有什么主意吗?
答案 0 :(得分:2)
我相信,由于在信号处理程序中调用了标准库函数(不在信号安全函数列表中),您在这里所拥有的是未定义的行为。
信号处理程序功能(由用户定义)的限制范围很广,documented here。
要注意的另一件事是,信号处理程序是否引用了具有静态或线程本地(自C ++ 11起)存储持续时间而不是std::atomic
(自C ++ 11起)或{ {1}}。
正如@BasileStarynkevitch指出的那样,如果您使用的是Linux,请确保仅从信号处理程序中调用async-signal-safe函数。