首页 > 编程语言 >cornerstone中delayed_task,timer_task及scheduler源码解析

cornerstone中delayed_task,timer_task及scheduler源码解析

时间:2024-11-20 21:56:38浏览次数:1  
标签:task void ctx delayed timer 源码 impl

1.概述

delayed_task在cornerstone中充当一个base类,其延伸出的子类timer_task才是cornerstone用于实现定时器的类。
而scheduler是用于实现延时效果的调度器。
我们将按照delayed_task->timer_task->scheduler的顺序解析源码。

2.delayed_task源码解析

2.1 成员变量分析

class delayed_task
{
private:
    std::atomic<bool> cancelled_;
    void* impl_ctx_;
    std::function<void(void*)> impl_ctx_del_;
}
  • cancelled_表示是否取消了任务,使用atomic是防止在多线程环境下线程不安全。
  • impl_ctx_是给task具体执行的函数impl传递的上下文参数。
  • impl_ctx_del_负责删除任务。
    这里有3个知识点:
  • impl_ctx_设置成上下文参数,其是未知的,因此我们将其声明为void*
  • 为了支持包括lambda在内的任意函数,将del函数声明为std::function<void(void*)>
  • 由于task可能会被同时取消与调用,所以有多线程race-condition的情况

2.2 初始化

public:
    delayed_task() : cancelled_(false), impl_ctx_(nilptr), impl_ctx_del_()
    {
    }
    virtual ~delayed_task()
    {
        if (impl_ctx_ != nilptr)
        {
            if (impl_ctx_del_)
            {
                impl_ctx_del_(impl_ctx_);
            }
        }
    }

没什么好说的,就是对2.1成员分析的应用。

2.3 task执行

public:
    void execute()
    {
        if (!cancelled_.load())
        {
            exec();
        }
    }

execute是这个delayed_task对外提供的public接口,具体实现放在了exec里面,实现接口与实现分离。

protected:
    virtual void exec() = 0;

声明成virtual从而让子类实现。
(即使声明成private也可以让子类实现,这是nvi(non-virtual-interface)技巧)

3.timer_task源码解析

template <typename T>
class timer_task : public delayed_task
{
using executor = std::function<void(T)>;
private:
    executor exec_;
    T ctx_;
}

首先看成员变量,exec_即为具体的执行函数,ctx_即为exec_所需要的上下文参数。

然后到执行

protected:
    virtual void exec() __override__
    {
        if (exec_)
        {
            exec_(ctx_);
        }
    }

这里实现了基类声明的exec,执行前判断exec_是否有效。

4.scheduler源码解析

class delayed_task_scheduler
{
    __interface_body__(delayed_task_scheduler);

public:
    virtual void schedule(ptr<delayed_task>& task, int32 milliseconds) = 0;

    void cancel(ptr<delayed_task>& task)
    {
        cancel_impl(task);
        task->cancel();
    }

private:
    virtual void cancel_impl(ptr<delayed_task>& task) = 0;
};
}

schedule的任务就是负责将task延后milliseconds后执行。
同样的这里是声明为纯虚函数由子类实现。

子类的实现:

void asio_service::schedule(ptr<delayed_task>& task, int32 milliseconds)
{
    if (task->get_impl_context() == nilptr)
    {
        task->set_impl_context(new asio::steady_timer(impl_->io_svc_), &_free_timer_);
    }
    // ensure it's not in cancelled state
    task->reset();

    asio::steady_timer* timer = static_cast<asio::steady_timer*>(task->get_impl_context());
    timer->expires_after(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::milliseconds(milliseconds)));
    timer->async_wait([task](const asio::error_code err) mutable { _timer_handler_(task, err); });
}
void asio_service::cancel_impl(ptr<delayed_task>& task)
{
    if (task->get_impl_context() != nilptr)
    {
        static_cast<asio::steady_timer*>(task->get_impl_context())->cancel();
    }
}
  • 注意这里scheduler传入的参数是ptr<delayed_task>& task,但是在cornerstone里面真正用于定时器的是timer_task,这里存在多态的转换。
  • 利用asio中的steady_timer,将task绑定到timer上面
  • timer->expires_after设置定时器到期时间,timer->async_wait异步等待定时器到期,_timer_handler_(task, err);timer过期时调用回调函数执行task从而实现schedule功能

5.总结

  • 1.使用atomic实现多线程无锁编程。
  • 2.利用void*传入任意类型参数,利用 std::function<void(void*)>支持包括lambda在内的任意函数。

标签:task,void,ctx,delayed,timer,源码,impl
From: https://www.cnblogs.com/Tomgeller/p/18558949

相关文章

  • 基于springboot+vue的Java的航空飞机票务预约购票出行服务系统设计与实现(源码+文档+
    课题简介基于SpringBoot+Vue的航空飞机票务预约购票出行服务系统,为旅客提供一站式航空出行解决方案。后端采用SpringBoot构建核心服务,SpringDataJPA与MySQL数据库交互,存储航班信息、用户数据、订单详情等,SpringSecurity确保系统安全,进行严格的用户认证与......
  • windows使用tasklist | findstr组合命令快速查进程
    命令解释tasklist列出进程|管道findstr/v过滤下面是系统自带的进程排除掉“notepad.execalc.execmd.exetasklist.exefindstr.exesvchost.exeSystemmsedge.exeRegistrysmss.execsrss.exewininit.exeservices.exeexplorer.exewinlogon.exelsass.exefo......
  • ssm152家庭财务管理系统设计与实现+jsp(论文+源码)_kaic
    毕业设计(论文)题目:家庭财务管理系统设计与实现      摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本家庭财务管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处......
  • ssm151大学生就业信息管理系统+jsp(论文+源码)_kaic
      毕业设计(论文)题目:大学生就业信息管理系统设计与实现摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本大学生就业信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处......
  • ssm147旅游攻略网站设计+jsp(论文+源码)_kaic
    毕业设计(论文)题目:旅游攻略网站设计与实现摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游攻略网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息......
  • springboot汽车租赁智慧管理-计算机毕业设计源码96317
    目 录第1章引 言1.1选题背景1.2研究现状1.3论文结构安排第2章系统的需求分析2.1系统可行性分析2.1.1技术方面可行性分析2.1.2经济方面可行性分析2.1.3法律方面可行性分析2.1.4操作方面可行性分析2.2系统功能需求分析2.3系统性需......
  • springboot农产品小程序-计算机毕业设计源码31670
    摘要 近年来,电子商务的快速发展引起了行业和学术界的高度关注。农产品小程序旨在为用户提供一个简单、高效、便捷的新鲜农产品购物体验,它不仅要求用户清晰地查看所需信息,而且还要求界面设计精美,使得功能与页面完美融合,从而提升系统的可操作性。因此,我们需要深入研究信息内......
  • springboot高校心理咨询管理系统-计算机毕业设计源码31814
    摘 要本论文主要探讨了基于SpringBoot的高校心理咨询管理系统的设计与实现。随着高校心理健康教育的重要性日益凸显,一个高效、便捷的心理咨询管理系统对于提升高校心理咨询服务的质量和效率至关重要。本文首先分析了高校心理咨询管理的现状和需求,然后详细阐述了系统的整......
  • [免费]SpringBoot+Vue毕业设计论文管理系统【论文+源码+SQL脚本】
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue毕业设计论文管理系统,分享下哈。项目视频演示【免费】SpringBoot+Vue毕业设计论文管理系统Java毕业设计_哔哩哔哩_bilibili项目介绍现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为......
  • 基于yolov10的草莓成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:yolov10,草莓成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的草莓成熟度检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的......