C ++-实现JS的setTimeout的现代方法

时间:2018-08-13 11:43:14

标签: javascript c++ multithreading c++11 timeout

我正在构建一个应用程序,其中请求来自zeromq套接字。对于每个请求,我都想进行一些处理并发送响应,但是,如果经过了预定义的时间,我想立即发送响应。

在node.js中,我会做类似的事情:

async function onRequest(req, sendResponse) {
  let done = false;

  setTimeout(() => {
    if (!done) {
      done = true;
      sendResponse('TIMED_OUT');
    }
  }, 10000);

  await doSomeWork(req); // do some async work
  if (!done) {
    done = true;
    sendResponse('Work done');
  }
}

我现在唯一遇到的就是在c ++中设置超时。没有太多的c ++经验,但是我知道c ++ 11中的某些东西可以让我轻松地做到这一点。

我应该怎么做?

1 个答案:

答案 0 :(得分:1)

std::future是您要寻找的,可以与std::asyncstd::promisestd::packaged_task一起使用。 std::async的示例:

#include <iostream>
#include <string>
#include <future>
#include <thread>

int main()
{
    std::future< int > task = std::async(std::launch::async, []{ std::this_thread::sleep_for(std::chrono::seconds(5)); return 5; } );
    if (std::future_status::ready != task.wait_for(std::chrono::seconds(4)))
    {
        std::cout << "timeout\n";
    }
    else
    {
        std::cout << "result: " << task.get() << "\n";
    }
}

请注意,即使超时后任务仍将继续执行,因此,如果您想在任务完成前取消任务,则需要传递某种标记变量。