(6)libevent定时器

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;
}
posted @ 2023-11-09 22:57  osbreak  阅读(170)  评论(0编辑  收藏  举报