Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4562142
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: C/C++

2011-01-31 11:10:23

timespec和timeval是POSIX的精度秒以下的时间类型,前者精确到纳秒,后者精确到微秒。定义如下:

  1. struct timespec {
  2.     __kernel_time_t tv_sec; /* seconds */
  3.     long tv_nsec; /* nanoseconds */
  4. };
  5. struct timeval {
  6.     __kernel_time_t tv_sec; /* seconds */
  7.     __kernel_suseconds_t tv_usec; /* microseconds */
  8. }

当时我要取当前时间0.5秒后的时间,就想当然的给timeval.tv_usec加上了500000。还算了以下整形的表示范围,确定这样做不会导致溢出。可是调试时发现这个时间点怎么都等不来,哪怕是1秒、2秒、3秒后。

问题在于,给timeval.tv_usec加上5*10^5之后,确实没有超出整形的表示范围。但是!tv_usec的范围也仅仅是10^6,这样做tv_usec的值就可能超出10^6。得到的这个时间就是无效的…所以,安全的办法是:

  1. struct timeval tv;
  2. tv.tv_usec += 500000;
  3. if (tv.tv_usec >= 1000000)
  4. {
  5.     tv.tv_sec += tv.tv_usec / 1000000;
  6.     tv.tv_usec %= 1000000;
  7. }

p.s原文地址:, 欢迎访问纯爷们的小生活

阅读(2820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~