如何在C ++ 11中干净地终止进程?

时间:2015-11-10 08:44:19

标签: c++ multithreading c++11 terminate

我想知道是否有一种好方法可以在一段时间后终止用C ++ 11编写的进程?

在我的过程中,我有一个主类,其中运行主程序的纯虚函数EditText可以在通信过程中被阻止。我希望我的run()函数在一段时间后被强制完成(即使被阻止),并且我的主类(以及成员的所有析构函数)的析构函数被调用。

现在我有一个通过回调呼叫run()的计时器。

std::terminate

3 个答案:

答案 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返回

有关相关提示,另请参阅thisthat

答案 2 :(得分:1)

最好的解决方案是将run()包装在一个帖子中。

std::thread([&]()
{
   run();
   finish.notify_all();
}).detach();

std::unique_lock<std::mutex> lock(waitFinish);
finish.wait_for(lock, time);
相关问题