1

我正在尝试测量返回std::future对象的 API 调用的持续时间。

我目前的方法如下所示:

std::chrono::high_resolution_clock::time_point endTime, startTime = std::chrono::high_resolution_clock::now();

std::shared_future<API::response> responseFuture = API::request();

std::future_status status = responseFuture.wait_for(3s); // Some Timeout

if (status == std::future_status::ready)
  endTime = std::chrono::high_resolution_clock::now();
else
  // error handling

但是,我不确定std::future::wait_for. cppreference.com指出:

由于调度或资源争用延迟,此函数可能会阻塞超过 timeout_duration。

我不担心阻塞时间超过 timeout_duration,但我确实需要wait_for在对象可用后立即返回std::future,即没有按照

while(!ready){
  std::this_thread::sleep_for(10ms);
}

这是有保证的吗?

4

2 回答 2

2

一旦共享状态准备好或超时(加上一点)过去,该函数将返回。根据 [futures.unique.future]/21 函数的效果是

如果共享状态包含延迟函数([futures.async]),则无,否则阻塞,直到共享状态准备好或直到 rel_time 指定的相对超时([thread.req.timing])到期。

强调我的

并且[thread.req.timing]

  1. 实现在从超时返回时必然会有一些延迟。中断响应、函数返回和调度中的任何开销都会导致“实现质量”延迟,表示为持续时间Di。理想情况下,此延迟为零。此外,任何对处理器和内存资源的争用都会导致“管理质量”延迟,表示为持续时间Dm。延迟持续时间可能因超时而异,但在所有情况下,越短越好。

  2. 名称以 _for 结尾的函数采用指定持续时间的参数。这些函数产生相对超时。实现应该使用稳定的时钟来测量这些函数的时间。326 给定一个持续时间参数Dt,超时的实时持续时间是Dt+Di+Dm

其中谈到了在函数实际返回之前可能会添加到超时的额外时间。

于 2020-03-26T13:32:32.533 回答
1

您在抢占式多线程环境中工作;“立即”没有任何事情发生。一旦你通过阻塞(或者它窃取你的时间片)将你的时间片交给操作系统,你就放弃了控制。解锁互斥锁后,操作系统会在某个时候解锁您的线程。操作系统会尝试提示这些事情,但不能保证。

你所能期望的最好的就是“不久之后”。wait_for会给你的。

于 2020-03-26T15:04:42.173 回答