假设我们有一段代码,我们不能修改它,但我们想破坏它,当它运行太长(x 毫秒)时退出这段代码
伪代码
Throw exception after (500ms) {
auto result = Do some risky job, for example test string by regex with catastrophic backtracking risk.
}
catch ( Exception e ) {
//...
}
每件事都必须仍然在同一个线程中。
是否可以使用 c++11 或其他一些标准?
最佳答案
一般来说,如果代码中没有引发异常的代码,或者代码调用的代码中没有引发异常的代码,C++ 就没有办法在代码中引发异常。
您可以嵌入 ASL、脚本语言或单独的进程。所有 3 个都可以设计为可中断的(例如,可以终止进程)。
Boost 有可中断的线程。它的工作原理是它在 boost 同步原语(互斥体等)中有钩子(Hook),所以当你与它们交互时,它会检查你的线程是否已被告知停止。如果是这样,它就会抛出异常。
一个简单的部分解决方案是
std::vector<std::future<R()>> futures;
futures.push_back( std::async( std::launch::async, []()->R{ /* code */ ) );
using std::chrono::literals;
if (futures.back().wait_for(500ms)==std::future_status::ready) {
auto r = futures.back().get();
futures.pop_back();
clear_ready_futures(futures); // wait for 0ms and if so, discard and destroy
return r;
}
// failed case
这里我们的 futures
存储失效的 futures(实际上是线程)。 clear_ready_futures
清除所有已完成的旧的。
已经启动的任务仍然会运行完成,窃取 cpu,但调用代码不必等待它们。
关于C++11 在同一线程中执行 block 但超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40346438/