成千上万的客户程序定时从服务器查询一些数据,并希望分散查询时间,减轻被查询的服务器的压力。一个随机定时器能够实现这个要求。 #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); } }