调用C库函数time(NULL)时出现的时间倒转现象?

kacy16 2015-01-13 06:39:32
在WINDOWS 7 系统(开发工具为VC)上开发了一软件,软件程序中的某一部分
的处理逻辑为:先记录下一开始时间,然后在开始时间之后的两秒内
一直在检测某种状态,如果检测到该状态,则返回true,如果没有检测到该状态则返回false。相应的代码如下:
bool is_status_change()
{
bool blnret = false;
unsigned int start_secs;
unsigned int cur_secs;

do_some_thing();
start_secs =time(NULL); //获得系统时间(单位:秒)

while ( (cur_secs= (unsigned int)time(NULL)) - start_secs <=2 )
{
int checkret = check_status();
if (checkret == 1)
{
blnret =true;
break;
}
Sleep(30);
}
return blnret;
}

整个软件大概运行了有4天, 其中is_status_change是以很频繁的次数被调用着,理论上均可以返回true的正确值。
但是通过日志记录可以得知,is_status_change有一次返回了false的错误值,究其错误的原因,竟然是发现
time(NULL)函数会发生时间倒回的现象,在 while ( (unsigned int)time(NULL) - start_secs <=2 )语句中
的获取的当前时间cur_secs比开始时间start_secs要小,由于都是unsigned值,一相减,负数变成很大的正数了。
大概的日志记录如下:
2015-01-05 21:08:13 is_status_change 返回true
2015-01-05 21:08:14 is_status_change 返回true
.....
2015-01-05 21:09:10 is_status_change 返回true
2015-01-05 21:09:11 is_status_change 返回true
2015-01-05 21:09:11 is_status_change 返回true
2015-01-05 21:09:12 is_status_change 返回true
2015-01-05 21:08:13 is_status_change 返回false
2015-01-05 21:08:14 is_status_change 返回true
2015-01-05 21:08:14 is_status_change 返回true
............
2015-01-05 21:09:09 is_status_change 返回true
2015-01-05 21:09:10 is_status_change 返回true

通过日志记录可以推断得出,time()函数在某些时候返回的时间秒数会比前一阶段所调用时返回的要小,即会发生时间倒转的现象,想请教各位高手,我的这个推断是否正确合理,各位是否有在实际情况遇到这种现象,以及怎么避免这种异常现象的发生?谢谢!
...全文
443 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
//将
 while ( (cur_secs= (unsigned int)time(NULL)) - start_secs <=2 )
  {
//……
//改为
 while (1) {
  cur_secs= (unsigned int)time(NULL);
  if (cur_secs-start_secs>2) break;
//  ……
707wk 2015-01-14
  • 打赏
  • 举报
回复
引用 4 楼 xionggch 的回复:
不会是有人动了系统时间吧
+1
xionggch 2015-01-14
  • 打赏
  • 举报
回复
不会是有人动了系统时间吧
FancyMouse 2015-01-14
  • 打赏
  • 举报
回复
2015-01-05 21:09:12 is_status_change 返回true 2015-01-05 21:08:13 is_status_change 返回false
Really_want 2015-01-13
  • 打赏
  • 举报
回复
case 1: 进while()前,blnret = false,在检测的2秒内check_status()都返回0,blnret值不变,退出while(),blnret还是原来的false

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧