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

How can you cleanly terminate a process in C++11?

不知有没有什么好的方法可以让我用C++11写的进程过一段时间就终止?

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

现在我有一个计时器,它通过回调调用 std::terminate

namespace Timer
{
    void start(Duration time, function<void()> task)
    {
        thread([time, task]() {
            this_thread::sleep_for(time);
            task();
        }).detach();
    }
}

我猜您使用的是 Linux 或其他 POSIX 系统。 Event loops 和轮询在 C++11 中未标准化,需要特定于操作系统的东西。

你的事件循环不应该被长时间阻塞。它应该有一些有限的 - 但不是太大 - 超时。在 POSIX 上,在该管道上使用 poll(2) in your event loop with a reasonable timeout (e.g. a second). Alternatively, use a pipe (internal to the process) to trigger the event loop (so some other thread -or even a signal handler- would write(2),事件循环将轮询它并 read 它,并可能停止,因此从 run)

返回

另请参阅 this and 以获取相关提示。

真正的解决方案是治本而不是治标:

  • 症状:run 功能永远不会结束
  • 原因:通信请求永远不会结束

大多数通信(输入)功能都是可中断的,或者有本机超时。如果您的通信例程没有本机超时,您可以(也许)使用 alarm Posix 调用将它们包装起来,应该干净地中断它们并允许 运行 函数干净地退出。

你只需要注意 alarm 在后台使用信号,所以你不能阻止 SIG_ALRM,但你可以用它来安装一个信号处理程序来存储 某处 已被调用。

恕我直言,与使用 std::terminate.

直接终止程序相比,它会更简单、更清晰,并且具有更好的关注点分离

以上只处理了run永不结束的情况。如果你想限制它的时间 运行s,你应该在你的代码中识别 可中断的地方 如果允许 运行 时间耗尽,并始终如一地把所有可能阻塞的通信 IO 超时。

最佳解决方案是将 run() 包裹在一个线程中。

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

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