面试题:预期等待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
相关产品推荐
相关产品推荐

