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

this_thread::sleep_until提前返回问题排查(Ubuntu22.04 + g++11.2.0)

为什么每分钟整点执行的C++代码输出会出现差1秒的情况?

你写的代码意图是在每分钟的起始时刻执行逻辑,但输出里出现了59、239这类和预期整秒数差1的结果,核心原因是时间精度不匹配和系统调度的微小不确定性,具体拆解如下:

  • time(NULL)的秒级精度限制:
    chrono::system_clock和sleep_until支持纳秒级精度,但time(NULL)只能返回整秒时间戳。当sleep_until唤醒时,可能刚好处于整秒的前几纳秒(比如目标时间是t0+60.000000000秒,但系统因调度或硬件时钟误差,在t0+59.999999999秒就完成唤醒),此时time(NULL)返回的还是t0+59秒,计算出的差值自然就是59而非预期的60。

  • 系统调度的不确定性:
    Linux下sleep_until底层调用的nanosleep,可能会因为系统调度优先级、硬件中断等原因提前返回,或者唤醒时机刚好卡在整秒边界,导致time(NULL)的取值落在上一分钟的最后一秒。

  • 关于你怀疑的两种情况:

    1. sleep_until提前返回的可能性存在,但更多是精度问题而非函数本身故障;
    2. time函数返回的时间不会早于实际时间,只是它的精度太低,无法反映纳秒级的时间变化。

修正后的代码示例

用chrono系列接口统一处理时间,避免精度不匹配问题:

#include <bits/stdc++.h>
int main(){
    using namespace std;
    using namespace std::chrono_literals;
    auto now = chrono::system_clock::now();
    // 计算下一分钟的起始时刻(精确到秒)
    auto now_sec = chrono::floor<chrono::seconds>(now);
    auto start_time = now_sec + 60s - (now_sec % 60s);
    for(;; start_time += 60s){
        this_thread::sleep_until(start_time);
        // 用chrono高精度接口计算差值
        auto diff = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now() - (start_time - 60s)).count();
        cout << diff << endl;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:09:15