linux 定时器(c++)时间升序链表

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

刚好前两天学长给我们讲座中提到服务器客户的超时处理,刚好又在看《高性能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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值