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

面试题:预期等待1小时的C语言函数Bug排查与解决方案

现有解答校验

  • 问题(1)的理解完全正确,这段代码的预期作用就是阻塞等待1小时后退出函数。
  • 问题(3)的原因分析完全正确,但是你提供的修复方案存在问题:C语言标准中负数做取模运算的结果为负,跨零点后clcTime() - time得到负数,直接对3600取模永远不会得到0,还是会陷入死循环。

问题(2)异常场景与修复方案

异常场景

线程/进程被操作系统调度挂起、系统时间被NTP同步向前校准、用户手动修改系统时间等场景,都会导致clcTime() - time的差值直接跳过3600这个精确值(比如从3599直接跳到3601),原代码的等值判断永远无法命中,程序陷入死循环。

修复方案

不需要判断差值刚好等于3600,改为判断差值小于3600就继续循环即可:

// 未处理跨天的临时修复,仅解决问题(2)
while (clcTime() - time < 3600);

问题(3)优化修复方案

要同时解决跨天和跳值的问题,只需要在计算差值的时候处理跨天的回绕逻辑即可,一天总秒数为86400,计算实际差值后再判断是否大于等于3600:

void myFunction(){
  int time = clcTime();
  int diff;
  do {
    // 加86400再模86400,保证差值永远是正数,跨天也能计算正确的间隔秒数
    diff = (clcTime() - time + 86400) % 86400;
  } while (diff < 3600);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:27:00