libevent事件
一、libevent非持久定时器
#include <iostream>
#include <event2/event.h>
#include <signal.h>
using namespace std;
static timeval t1 = { 1, 0 }; // 1秒0毫秒
void timer(int sockfd, short what, void* arg) {
cout << "[ timer 1s ]" << flush;
event* ev = (event*)arg;
// 非持久定时器, 再次添加定时任务
if (!evtimer_pending(ev, &t1)) {
evtimer_del(ev);
evtimer_add(ev, &t1);
}
}
int main(int argc, char* argv[])
{
event_base* base = event_base_new();
//定时器,非持久事件
event* timer_ev = evtimer_new(base, timer, event_self_cbarg());
if (!timer_ev) {
cout << "evtimer_new failed!" << endl;
return 1;
}
evtimer_add(timer_ev, &t1); // 插入性能 O(logn)
//进入事件主循环
event_base_dispatch(base);
event_base_free(base);
return 0;
}
二、libevent持久定时器
#include <iostream>
#include <event2/event.h>
#include <signal.h>
using namespace std;
void timer(int sockfd, short what, void* arg) {
cout << "[timer2]" << endl;
}
int main(int argc, char* argv[])
{
event_base* base = event_base_new();
// 持久事件
static timeval t2;
t2.tv_sec = 1;
t2.tv_usec = 200000;//微秒
event* persist_timer = event_new(base, -1, EV_PERSIST, timer, 0);
event_add(persist_timer, &t2); //插入性能 O(logn)
// 进入事件主循环
event_base_dispatch(base);
event_base_free(base);
return 0;
}
二、优化libevent超时
#include <iostream>
#include <event2/event.h>
#include <signal.h>
using namespace std;
void timer(int sockfd, short what, void* arg) {
cout << "[timer2]" << endl;
}
int main(int argc, char* argv[])
{
event_base* base = event_base_new();
// 持久事件
event *ev = event_new(base,-1,EV_PERSIST,timer,0);
//超时优化性能优化,默认event 用二叉堆存储(完全二叉树) 插入删除O(logn)
//优化到双向队列 插入删除O(1)
static timeval tv_in = {3,0};
const timeval *t;
t = event_base_init_common_timeout(base,&tv_in);
event_add(ev3,t3); // 性能优化:插入性能 O(1)
// 进入事件主循环
event_base_dispatch(base);
event_base_free(base);
return 0;
}