Welcome

首页 / 软件开发 / C++ / Muduo 网络编程示例(三)定时器

Muduo 网络编程示例(三)定时器2014-04-03 Blog.csdn.net 陈硕程序中的时间

程序中对时间的处理是个大问题,我打算单独写一篇文章来全面地讨论这个问 题。文章暂定名《〈程序中的日期与时间〉第二章 计时与定时》,跟《〈程序中的日期与时间〉第一 章 日期计算》放到一个系列,这个系列预计会有四篇文章。

在这篇博客里里我先简要谈谈与编 程直接相关的内容,把更深入的内容留给上面提到的日期与时间专题文章。

在一般的服务端程序设计中,与时间有关的常见任务有:

1. 获取当前时间,计算时间间隔 ;

2. 时区转换与日期计算;把纽约当地时间转换为上海当地时间;2011-02-05 之后第 100 天 是几月几号星期几?等等

3. 定时操作,比如在预定的时间执行一项任务,或者在一段延时之后 执行一项任务。

其中第 2 项看起来复杂,其实最简单。日期计算用 Julian Day Number,时区 转换用 tz database;惟一麻烦一点的是夏令时,但也可以用 tz database 解决。这些操作都是纯函 数,很容易用一套单元测试来验证代码的正确性。需要特别注意的是,用 tzset/localtime_r 来做时 区转换在多线程环境下可能会有问题;对此我的解决办法是写一个 TimeZone class,以避免影响全局 ,将来在日期与时间专题中会讲到。以下本文不考虑时区,均为 UTC 时间。

真正麻烦的是第 1 项和第 3 项。一方面,Linux 有一大把令人眼花缭乱的与时间相关的函数和结构体,在程序中该如何 选用?另一方面,计算机中的时钟不是理想的计时器,它可能会漂移或跳变;最后,民用的 UTC 时间 与闰秒的关系也让定时任务变得复杂和微妙。当然,与系统当前时间有关的操作也让单元测试变得困难 。

Linux 时间函数

Linux 的计时函数,用于获得当前时间:

* time(2) / time_t (秒 )

* ftime(3) / struct timeb (毫秒)

* gettimeofday(2) / struct timeval (微 秒)

* clock_gettime(2) / struct timespec (纳秒)

* gmtime / localtime / timegm / mktime / strftime / struct tm (这些与当前时间无关)

定时函数,用于让程序等 待一段时间或安排计划任务:

* sleep

* alarm

* usleep

* nanosleep

* clock_nanosleep

* getitimer / setitimer

* timer_create / timer_settime / timer_gettime / timer_delete

* timerfd_create / timerfd_gettime / timerfd_settime