c++ 定时器实现

1. setitimer方法

nginx 实现, 在这段代码中,定义了itimerval的数据结构,并设置这个数据结构的值,从而定时器的间隔时间,settimer的函数第一个参数表示经过timer就会触发sigalarm事件, 然后注册了信号sigalarm的事件,从而触发定时器

signal(SIGALRM, printMsg);  
void printMsg(int num) {  

  printf("%s","Hello World!!\n");  

}  

struct itimerval  itv;
itv.it_interval.tv_sec = ngx_timer_resolution / 1000;
itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000
itv.it_value.tv_sec = ngx_timer_resolution / 1000;
itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;

  if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                          "setitimer() failed");
        }

2. pthread_mutex_timedlock
在dtc的agent实现中,先创建一个线程,然后在线程中用如下的函数来阻塞,从而达到定时器的目的。pthread_mutex_timedlock指的是阻塞愿意等待的时间ts

pthread_mutex_trylock(&wakeLock)
while(pthread_mutex_timedlock(&wakeLock, &ts) != 0)
{
    //DoSth
}

3. epoll_wait实现

可以设置epoll_wait的timeout从而达到定时器,epoll等待timeout秒之后就执行后面的程序

int epoll_wait(int efd, struct epoll_event *event, int maxeevents, int timeout)
//efd 由epoll_create创建的fd
//timeout 为一次监听的间隔
//当有事件触发 返回int 表示事件个数,event里存储的是触发的事件

模拟定时器写的一个代码

#include<stdio.h>
#include<sys/epoll.h>
#include <sys/time.h>
#include<time.h>
#include<signal.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_EVENTS 100
void printMsg(int num) {

        time_t t = time(NULL);
        struct tm *tt = localtime(&t);
        printf("%d,%d,%d\n", tt->tm_hour, tt->tm_min , tt->tm_sec);
        printf("%s","Hello World!!\n");

}
int main()
{
        struct epoll_event events[MAX_EVENTS];
        int  ep;
        int nfds;
        while(0==0)
{
        ep = epoll_create(100);
        signal(SIGALRM, printMsg);
        struct itimerval itv;
        itv.it_interval.tv_sec = 10 ;
        itv.it_interval.tv_usec = 0 ;
        //itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000;
        itv.it_value.tv_sec = 10;
        itv.it_value.tv_usec = 10;
        //itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;
        setitimer(ITIMER_REAL, &itv, NULL);
        nfds = epoll_wait(ep, events, MAX_EVENTS, -1);
        printf("%d events occur\n", nfds);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值