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

