|
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef TRUE
- #define TRUE 1
- #endif
- /**
- * 随机定时器:一个定时器,它的定时有一定的随机性。
- *
- * 本函数是随机定时器的核心部分
- *
- * 用法:一个单独的线程反复调用此函数,返回TRUE执行任务,FALSE则不执行
- *
- * 实用例子:成千上万的客户程序定时从服务器查询一些数据,
- * 并希望分散查询时间,减轻被查询的服务器的压力。
- *
- * @param range 定时器的时间间隔(也即隔多长时间执行一次)
- * @param mistake 误差,单位为秒,比调用此函数的时间间隔大一点即可
- *
- * @return 返回TRUE执行任务,FALSE则不执行
- */
- int is_rtime(int range, int mistake)
- {
- static time_t upper = -1;
- static time_t lower = -1;
- static time_t random = -1;
- static int run = FALSE;
- time_t current;
- // 获取当前时间
- if( -1 == (current = time(NULL)) ){
- return FALSE;
- }
- // 设置时间
- if( upper == -1 || // 第一次执行,要初始化
- current >= lower ){ // 过了下限,重新设置时间
- upper = current;
- lower = upper + range;
- srand(upper);
- random = upper + rand() % range;
- run = FALSE;
- return FALSE;
- }
- //到了某个时间段,并且只能在这个时间段内执行一次
- if( abs(current - random) < mistake && run == FALSE ){
- run = TRUE;
- return TRUE;
- }
- return FALSE;
- }
- int main()
- {
- int secondsofday = 24 * 60 * 60;
- while(1)
- {
- if( is_rtime(10, 1) ){
- time_t t;
- t = time(NULL);
- printf("%s", ctime(&t));
- }
- sleep(1);
- }
- }
复制代码 成千上万的客户程序定时从服务器查询一些数据,并希望分散查询时间,减轻被查询的服务器的压力。一个随机定时器能够实现这个要求。
|
|