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
相关产品推荐
相关产品推荐

