如何干净地终止 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);
不知有没有什么好的方法可以让我用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);