【发布时间】:2015-11-10 08:44:19
【问题描述】:
我想知道是否有一种好方法可以在一段时间后终止我用 C++11 编写的进程?
在我的进程中,我有一个带有纯虚函数run() 的主类,它运行可能在通信进程中被阻塞的主程序。我希望我的 run() 函数在一段时间后被强制完成(即使被阻塞),并且我的主类的析构函数(以及所有成员的析构函数)被调用。
现在我有一个计时器,它通过回调调用std::terminate。
namespace Timer
{
void start(Duration time, function<void()> task)
{
thread([time, task]() {
this_thread::sleep_for(time);
task();
}).detach();
}
}
【问题讨论】:
-
如果
run()函数不返回,就不能干净地结束程序。也许你可以在一个线程中运行run(),并在其上调用thread::detach():主析构函数将被调用,但我不会称之为clean。 -
我也遇到了这个问题,一个程序可能会卡在通信中。我已经为其添加了心跳机制,所以我知道每 X 秒(在我的情况下是每 45 秒)将接收和发送一条消息,然后超时一分钟。所以我从来没有遇到过卡住并等待消息的情况。当然最坏的情况是程序需要 45 秒才能关闭,但它是否干净!
-
如果一个(非分离的)线程被阻塞,它不能在不先解除阻塞的情况下优雅地终止。您必须通过例如使用等待/通知或使用
wait_for或类似方法定期检查状态来在语法上控制它。 -
我无法解锁额外的库,我不想等待通信超时(这与通信问题无关)。我只是想强制程序在一段时间后完成,以便能够及时正确地停止进程(调用所有析构函数)。如果主程序在定时器之前完成,它也应该正确终止(运行时间可以比定时器短,但永远不会长)。
-
将
run包裹在一个线程中。如果它没有及时完成,只需正常退出即可。您将正确关闭run以上的所有内容。run下面的东西你不控制,反正也没有希望让它们优雅退出。
标签: c++ multithreading c++11 terminate