刚好前两天学长给我们讲座中提到服务器客户的超时处理,刚好又在看《高性能linux服务器编程》有发现这方面的知识,就拿出来总结一下。
第一,我们为什么需要自制计时器,c++ /c 的alarm不是可以实现定时操作吗,还有sleep…???
linux下一个进程共享一个alarm闹钟定时器,然而服务器肯定是多用户的,我们肯定得想方法给每个客户整一个定时器
也就是接下来要介绍的升序时间链表,除此之外还有时间轮,时间最小堆等更好的方法。
util_timer类代表着每一个节点,利用time()存储绝对时间,client_data是用户的数据
util_timer.h
//
// Created by adl on 2020/7/22.
//
#ifndef TEST2_UTIL_TIMER_H
#define TEST2_UTIL_TIMER_H
#include <time.h>
class client_data;
class util_timer{
public:
util_timer();
public:
time_t expire;
void(*cb_func)(client_data*);
client_data*user_data;
util_timer*prev;
util_timer*next;
};
#endif //TEST2_UTIL_TIMER_H
util_timer.cpp
//
// Created by adl on 2020/7/22.
//
```cpp
#include "util_timer.h"
util_timer::util_timer() : prev(nullptr), next(nullptr) {
}
这个客户类中也会有一个util_timer指针可以说是客户信息类和时间节点类相互捆绑了
client_data.h
//
// Created by adl on 2020/7/22.
//
#ifndef TEST2_CLIENT_DATA_H
#define TEST2_CLIENT_DATA_H
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <libgen.h>
#include <stdlib.h>
#include <errno.h>
#define BUFFER_SIZE 64
class util_timer;
class tw_timer;
class heap_timer;
struct client_data {
sockaddr_in address;
int sockfd;
char buf[BUFFER_SIZE];
union {
// tw_timer *timer;
util_timer *timer;
// heap_timer*timer3;
};
};
#endif //TEST2_CLIENT_DATA_H
链表类
sort_timer_lst.h
//
// Created by adl on 2020/7/22.
//
#ifndef TEST2_SORT_TIMER_LST_H
#define TEST2_SORT_TIMER_LST_H
class util_timer;
class sort_timer_lst{
public:
sort_timer_lst();
virtual ~sort_timer_lst();
void add_timer(util_timer*timer);
void adjust_timer(util_timer*timer);
void del_timer(util_timer*timer);
void tick();
private:
void add_timer(util_timer*timer,util_timer*lst_head);
util_timer*head;
util_timer*tail;
};
#endif //TEST2_SORT_TIMER_LST_H
sort_timer_lst.cpp
//
// Created by adl on 2020/7/22.
//
#include <cstdio>
#include "sort_timer_lst.h"
#include "util_timer.h"
sort_timer_lst::sort_timer_lst() : head(nullptr), tail(nullptr) {
}
sort_timer_lst::~sort_timer_lst() {
util_timer *tmp = head;
while (tmp) {
head = tmp->next;
delete tmp;
tmp = head;
}
}
void sort_timer_lst::add_timer(util_timer *timer) {
if (!timer) {
return;
}
/*
* 如果没头节点,则将这个节点作为头节点*/
if (!head) {
head = tail = timer;
return;
}
/*
* 如果该节点的时间大小比头节点时间小那么修改这个节点为新的头节点*/
if

本文介绍了在Linux服务器编程中,如何使用C++实现时间升序链表来处理多用户的定时器需求。相对于单一的alarm和sleep,这种链表方法能为每个客户提供独立的定时器。通过示例代码展示了util_timer类和sort_timer_lst类的设计,用于创建和管理这些定时器,并在Handleinactiveconnections.cpp中演示了关闭非活跃连接的场景。尽管时间升序链表在添加和查找上的效率不高,但在特定场景下仍具实用性。文章最后提及将探讨更高效的定时器实现,如时间轮。
最低0.47元/天 解锁文章
2999

被折叠的 条评论
为什么被折叠?



