C++11 在同一线程中执行 block 但超时

标签 c++ regex c++11 thread-safety boost-regex

假设我们有一段代码,我们不能修改它,但我们想破坏它,当它运行太长(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/

相关文章:

c++ - ARM 平台的数据转换(来自 x86/x64)

C++03:有没有办法使类型每次包含在模板参数中时都会编译为不同的类型?

javascript - 需要帮助格式化字符串文字正则表达式

html - 查找具有特定文本的 <td> 标签值(Beautiful Soup)

multithreading - 使用notify_one()向运行线程发出多个std::condition_variable通知

c++ - 不合理删除的 move 构造函数

java类问题

c++ - 通过 boost::function_base 调用 boost::function

python - 用于匹配某个内容直到某个点的正则表达式

c++ - std::move 是否总是按预期工作?