首页 > 编程语言 >C++ 定时器,时间轮算法

C++ 定时器,时间轮算法

时间:2024-12-23 11:31:07浏览次数:4  
标签:wheel index 定时器 C++ current std 算法 ms size

C++ 实现定时器的两种方法(线程定时和时间轮算法修改版)_c++ 定时器-CSDN博客

 

#include <chrono>
#include <functional>
#include <list>
#include <mutex>
#include <thread>
#include <vector>

class TimerWheel {
public:
    using Task = std::function<void()>;

    explicit TimerWheel(size_t wheel_size, int interval_ms)
        : wheel_size_(wheel_size),
        interval_ms_(interval_ms),
        wheel_(wheel_size),
        current_index_(0) {}

    ~TimerWheel() {
        Stop();
    }

    void Start() {
        if (running_) {
            return;
        }
        running_ = true;
        thread_ = std::thread([this]() {
            while (running_) {
                std::this_thread::sleep_for(std::chrono::milliseconds(interval_ms_));
                Tick();
            }
        std::cout << "timer oooops!" << std::endl;
            });
        thread_.detach();
    }

    void Stop() {
        if (!running_) {
            return;
        }
        running_ = false;
        if (thread_.joinable()) {
            thread_.join();
        }
    }

    void AddTask(int timeout_ms, Task task) {
        std::lock_guard<std::mutex> lock(mutex_);
        size_t ticks = timeout_ms / interval_ms_;
        size_t index = (current_index_ + ticks) % wheel_size_;
        size_t allindex = index;
        for (size_t i = 1 ; allindex < wheel_size_; i++)
        {
            allindex = index * i;
            if (allindex >= wheel_size_)
                break;
            wheel_[allindex].push_back(task);
        }
        
    }

private:
    void Tick() {
        std::lock_guard<std::mutex> lock(mutex_);
        auto& tasks = wheel_[current_index_];
        for (const auto& task : tasks) {
            task();
        }
        //tasks.clear();
        current_index_ = (current_index_ + 1) % wheel_size_;
    }

private:
    size_t wheel_size_;
    int interval_ms_;
    std::vector<std::list<Task>> wheel_;
    size_t current_index_;
    bool running_ = false;
    std::thread thread_;
    std::mutex mutex_;
};
View Code

 

标签:wheel,index,定时器,C++,current,std,算法,ms,size
From: https://www.cnblogs.com/peifx/p/18623598

相关文章

  • 少儿C++编程、信奥(GESP、CSP-J等)入门书籍推荐
    选择标准1、要有对应的OJ题库2、有相关的PPT课件3、有相关的视频1、《信息学奥赛一本通编程启蒙C++版》董永建(2024-06-01)合集·信奥一本通c++启蒙版480题通关秘籍,全网最全教程!逻思叮编程的个人空间-逻思叮编程个人主页-哔哩哔哩视频合集·信息学奥赛一本通......
  • 与程序设计有关的网址收藏C/C++(CodeBlocks/wxWidgets)、Pascal(Lazarus/Delphi/LCL/FCL)
    0.前言在网上查看资料的时候,经常会看到一些好的文章,这些文章介绍的知识点可能是当时使用的,也可能是以后能用得着的。对于那些以后能用得着的知识点,有时在用到的时候在想找却忘记了是在哪一篇文章里了,或者再搜索却搜索不到了。通常遇到以后可能需要的文章,最好的办法是收藏。可是......
  • SM2 - 数字签名算法
    符号A,B:使用公钥密码系统的两个用户。\(a,b\):\(F_q\)中的元素,他们定义\(F_q\)上的一条椭圆曲线\(E\)。\(d_A\):用户A的私钥。\(E⁡(F_q)\):\(F_q\)上椭圆曲线\(E\)的所有有理点(包括无穷远点\(O\))组成的集合。\(e\):密码杂凑函数作用于消息\(M\)的输出值。\(e'\):密码杂凑函数作......
  • 揭示Newman教授的错误:Dijkstra算法的松弛次序与最短路径中的边次序不一定相同
    揭示Newman教授的错误:Dijkstra算法的松弛次序与最短路径中的边次序不一定相同Dijkstra算法简介Newman教授的观点反驳观点示例图Dijkstra算法的执行过程分析松弛次序与最短路径中的边次序结论C语言实现Dijkstra算法在探讨Dijkstra算法的松弛次序是否一定与最......
  • 算法网关视频分析网关热知识:如何为监控摄像机选择最合适的电源适配器?
    在现代监控系统中,选择合适的电源适配器对于确保监控摄像机的稳定运行至关重要。本文将详细介绍在选择电源适配器时应考虑的关键因素,以及如何通过这些因素来确保监控系统的长期可靠性和高效性能。通过综合考虑电压匹配、功率需求、接口规格、供电方式、环境因素、稳定性和安全性以......
  • 排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
    排序:经常在算法题中作为一个前置操作,为了之后的贪心orelse做个铺垫,虽然我们经常都只是调用个sort,但是了解一些排序算法可以扩充下知识库排序的分类:从存储设备角度:✓内排序:在排序过程中所有数据元素都在内存中;✓外排序:当待排序元素所占空间大到内存存不下时,排序......
  • 算法之哈希表
    有效的字母异位词思想和滑动窗口找子串很像都是将字符串中的字符统计情况放到数组中,这个不需要进行窗口的移动,因为两个的长度必须相同。快乐数没有注意到提示无限循环,即当平方和重复出现时,不可能为快乐数,此时使用set对平方和进行存储,只有和前面都不重复时才会将此时的平方和放......
  • 深入探索人工智能的技术热点:生成式AI、强化学习与AI算法优化
    人工智能(AI)技术在不断发展中,带来了许多突破性的进展。我们看到了生成式AI在图像、文本生成等领域的广泛应用,也见证了强化学习在复杂决策问题中的成功实践。同时,随着AI技术逐渐走向实际应用,算法优化与效率提升成了新的技术焦点。在这篇博客中,我们将重点讨论目前在人工智能领域的......
  • C++ vector:代码舞台上伸缩自如的数据精灵舞链
    一、C++ vector 容器介绍1.STL容器概览C++STL涵盖多种容器,分顺序容器如(vector)与关联容器(如 map、set)。vector作为常用顺序容器,是动态数组,运行时可自动扩容量且随机访问高效。2.选用vector缘由动态伸缩:对比C风格数组大小固定,vector能自动管理内存,按需调整大......
  • C++中管理动态内存:析构函数中的`delete`使用指南
    在C++编程中,正确管理动态分配的内存是至关重要的。不当的内存管理可能导致内存泄漏、野指针和重复释放等问题。本文将详细介绍如何在C++类中使用delete和delete[]来释放动态分配的资源,并提供一些最佳实践,以确保资源被安全、有效地管理。1.析构函数中的delete当类的成员变......