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

C++单线程下如何仅用标准库实现固定频率调用指定函数

单线程固定频率调用实现(纯C++标准库)

约束适配:单线程运行、无第三方依赖、总运行时长30秒、调用频率100次/秒(间隔10ms)

核心实现思路

不要在每次循环中直接休眠10ms——这种写法会把目标函数执行耗时、系统休眠调度的微小误差逐次累加,运行时间越长频率偏差越大。正确做法是用单调递增的稳态时钟锚定每一次调用的绝对时间点,每次执行完目标函数后,直接休眠到下一个预设的调用时刻,自动抵消单次误差,全程无累计偏移。

注意:单线程模式下如果你的目标函数单次执行耗时超过10ms,物理上不可能达到100次/秒的调用频率,需要先优化目标函数的执行效率。

可直接运行的示例代码

#include <chrono>
#include <thread>

// 替换成你需要调用的目标函数
void target_function() {
    // 自定义业务逻辑
}

int main() {
    // 计时参数定义
    constexpr int call_frequency = 100;          // 每秒调用次数
    constexpr std::chrono::seconds total_duration{30}; // 总运行时长
    constexpr auto interval = std::chrono::duration_cast<std::chrono::steady_clock::duration>(
        std::chrono::seconds(1) / call_frequency
    );
    const int total_call_times = static_cast<int>(total_duration / interval); // 总调用次数固定为3000

    // 取稳态时钟作为计时基准,不受系统时间跳变影响
    auto next_call_time = std::chrono::steady_clock::now();

    for (int i = 0; i < total_call_times; ++i) {
        // 执行目标函数
        target_function();

        // 计算下一次调用的时间点
        next_call_time += interval;
        // 休眠到下一次调用时刻,自动补偿本次函数执行消耗的时间
        std::this_thread::sleep_until(next_call_time);
    }

    return 0;
}

关键说明

  • 时钟选型:采用std::chrono::steady_clock作为计时基准,该时钟为单调递增时钟,不会因为系统时间手动调整、网络时间同步出现时间回退或跳变,是做定时调度的唯一可靠选择。
  • 误差控制:基于绝对时间点做休眠调度,只要单次目标函数执行耗时小于10ms,全程不会产生累计误差,实际调用频率波动通常在1ms以内,完全满足常规业务需求。
  • 单线程合规:代码全程未创建任何新线程,std::this_thread::sleep_until仅阻塞当前主线程等待,完全符合单线程运行要求,没有引入额外并发逻辑。
  • 学习参考:如果需要深入理解实现细节,可以查阅C++标准库中std::chrono时间库、std::this_thread命名空间下休眠接口的相关说明,重点掌握时长、时间点、时钟三类核心概念的用法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:48:23