我想知道是否有一种好方法可以在一段时间后终止用C ++ 11编写的进程?
在我的过程中,我有一个主类,其中运行主程序的纯虚函数EditText
可以在通信过程中被阻止。我希望我的run()
函数在一段时间后被强制完成(即使被阻止),并且我的主类(以及成员的所有析构函数)的析构函数被调用。
现在我有一个通过回调呼叫run()
的计时器。
std::terminate
答案 0 :(得分:2)
真正的解决方案是处理原因而不是症状:
run
功能永不结束大多数通信(输入)功能都是可中断的,或具有本机超时。如果您的通信例程没有本机超时,您可以(可能)使用alarm
Posix调用来封装它们,该调用应该干净地中断它们并允许运行函数干净地退出。
你必须注意alarm
使用信号的事实,所以你不能阻止SIG_ALRM
,但你可以用它来安装一个信号处理程序,在某处存储 已被召唤。
std::terminate
直接终止该计划相比,它会更简单,更清晰,更容易分离。
以上仅处理run
永不结束的情况。如果要限制其运行的时间,则应在代码中识别可中断位置,以测试允许的运行时间是否已用尽,并始终对所有可能阻塞的通信IO进行超时。
答案 1 :(得分:1)
我猜你是在Linux或其他POSIX系统上。 Event loops和轮询在C ++ 11中没有标准化,需要特定于操作系统的东西。
您的事件循环永远不会被阻止很长时间。它应该有一些有限的 - 而不是太大 - 超时。在POSIX上,在事件循环中使用poll(2)并使用合理的超时(例如一秒)。或者,使用pipe(进程内部)来触发事件循环(因此某个其他线程 - 甚至是信号处理程序 - 将write(2)在该管道上,并且事件循环将轮询它并且read
它可能会停止,因此从run
返回
答案 2 :(得分:1)
最好的解决方案是将run()
包装在一个帖子中。
std::thread([&]()
{
run();
finish.notify_all();
}).detach();
std::unique_lock<std::mutex> lock(waitFinish);
finish.wait_for(lock, time);