You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++:如何获取std::future<T>::wait_for未超时情况下的耗时?

回答

很可惜,C++标准库的std::future并没有提供你期望的getElapsedTime()这类内置方法来直接获取任务的运行耗时——你得自己手动计算这段时间。

最可靠的方式是借助std::chrono库,在任务启动前后记录时间点,再计算时间差。这里推荐使用std::chrono::steady_clock,它是单调递增的时钟,不会受系统时间调整的影响,非常适合用来计算时间间隔。

下面是符合你需求的实现示例:

#include <iostream>
#include <future>
#include <chrono>
#include <thread>

class Someone {
public:
    void doSomething() {
        // 模拟实际的耗时操作
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
};

int main() {
    Someone obj;
    
    // 记录任务启动的时间点
    auto start = std::chrono::steady_clock::now();
    
    std::future<void> futureRet = std::async(std::launch::async, &Someone::doSomething, &obj);
    
    // 等待任务完成或超时
    auto status = futureRet.wait_for(std::chrono::seconds(30));
    
    if (status == std::future_status::ready) {
        // 记录任务完成的时间点
        auto end = std::chrono::steady_clock::now();
        // 转换为秒级别的耗时
        auto elapsedSeconds = std::chrono::duration_cast<std::chrono::seconds>(end - start);
        std::cout << "doSomething returned after <" << elapsedSeconds.count() << "> seconds." << std::endl;
    } else {
        std::cout << "Task timed out after 30 seconds." << std::endl;
    }
    
    return 0;
}

补充说明:

  • 如果你需要更精确的耗时(比如毫秒、微秒),只需要把std::chrono::seconds替换成对应的时间单位即可,比如std::chrono::milliseconds。
  • 这里记录的是从任务启动到wait_for返回且任务就绪的总时间,对于std::launch::async模式的异步任务来说,这个时间基本等于任务实际的运行耗时(因为任务是在独立线程中执行的)。
  • 如果任务是延迟执行的(std::launch::deferred),那么任务会在wait_for或get()调用时才开始执行,此时计算的时间就是任务实际执行的耗时。

内容的提问来源于stack exchange,提问作者Kackao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:11:46