boost::asio名字空间中的deadline_time类:定时器

本文详细介绍了asio库中的定时器模型,包括同步定时器和异步定时器的使用方法及其实现原理。通过实例展示了如何使用deadline_timer类进行时间终止等待,并解释了同步与异步定时器的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器是asio库中最简单的一个IO模型,提供等候时间终止的功能。

定时器功能的主要类是:deadline_timer类,类摘要如下

这里写图片描述

使用定时器时的头文件:

#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::asio;

1. 同步定时器

//同步定时器的用法
void synchronously_timer_test()
{
    std::cout << "wait for 5 seconds" << std::endl;

    boost::asio::io_service ios;  //所有asio程序必须有一个io_service对象
    boost::asio::deadline_timer t(ios, boost::posix_time::seconds(15));  //定时器对象构造
    std::cout << t.expires_at() << std::endl;  //查看终止的绝对时间
    t.wait();  //同步等待,如果不等待,则直接往下执行

    std::cout << "hello asio" << std::endl;
}

同步定时器和sleep()函数比较
1. thread库中的sleep()使用互斥量和条件变量,在线程中等待。
2. asio则是调用了操作系统的异步机制,如select、epoll等完成。

2. 异步定时器

异步定时器,增加了回调函数,并使用io_service::run()和定时器的async_wait()方法。

回调函数:asio库要求回调函数只能有一个参数,而且这个参数必须是const asio::error_code &类型。(async_wait()接受的回调函数类型是固定的)

实例:

//回调函数
void printing(system::error_code& e)
{
    std::cout << "asynchronously timer test: hello asio" << std::endl;
}

//异步定时器的用法
void asynchronously_timer_test()
{
    std::cout << "asychronously timer test begin" << std::endl;

    boost::asio::io_service ios;  //io_service对象
    boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2));  //定时器对象

    t.async_wait(printing);  //异步等待,传入回调函数,立即返回

    ios.run();  //异步IO必须
}

异步定时器区别于同步定时器:
1. async_wait()方法:通知 io_service 异步地执行 IO 操作,并注册回调函数,用于在IO操作完成时由事件多路分离器分派返回值(error_code)调用。
2. 最后必须调用io_service的run()成员函数,它启动前摄器的事件处理循环,阻塞等待所有的操作完成并分派事件。
如果不调用run(),那么虽然操作被异步执行了,但没有一个等待它完成的机制,回调函数将得不到执行机会。
3. 当定时器时间终止时,io_service将调用被注册的printing()回调函数,然后程序结束。

3. 异步定时器使用bind

async_wait()接受的回调函数类型是固定的,如果需要增减回调函数的参数,必须使用bind库来绑定参数以适配它的接口。

实例:

//带参数的回调函数
void printing(std::string &str)
{
    std::cout << "asynchronously timer test: hello asio" << std::endl;
    std::cout << str << std::endl;
}

//异步定时器的用法
void asynchronously_timer_test()
{
    std::cout << "asychronously timer test begin" << std::endl;

    boost::asio::io_service ios;
    boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2));

    std::string str("hello bind");
    t.async_wait(boost::bind(printing,boost::ref(str)));  //绑定参数,返回一个可用回调函数。

    ios.run();
}

4. 多线程中使用同步定时器 实例

//多线程中使用同步定时器
class printer
{
public:
    printer(boost::asio::io_service &io):m_strand(io),
        m_timer1(io,boost::posix_time::seconds(1)),
        m_timer2(io,boost::posix_time::seconds(1)),
        m_count(0){
        m_timer1.async_wait(boost::bind(&printer::print1, this));
        m_timer2.async_wait(boost::bind(&printer::print2, this));
    }

    void print1(){
        boost::mutex::scoped_lock lock(mu);
        if (m_count < 10){
            std::cout << "timer1:" << m_count << std::endl;
            ++m_count;
            m_timer1.expires_at(m_timer1.expires_at() + boost::posix_time::seconds(1));
            m_timer1.async_wait(boost::bind(&printer::print1, this));
        }

    }

    void print2(){
        boost::mutex::scoped_lock lock(mu);
        if (m_count < 10){      
            std::cout << "timer2:" << m_count << std::endl;
            ++m_count;
            m_timer2.expires_at(m_timer2.expires_at() + boost::posix_time::seconds(1));
            m_timer2.async_wait(boost::bind(&printer::print2, this));
        }

    }

private:
    boost::asio::io_service::strand m_strand;
    boost::asio::deadline_timer m_timer1;
    boost::asio::deadline_timer m_timer2;
    int m_count;
    boost::mutex mu;
};

void synchronously_in_multithread_test()
{
    std::cout << "synchronously_in_multithread_test begin: " << std::endl;
    boost::asio::io_service io;
    printer p(io);
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
    io.run();
    t.join();
}
<think>我们正在讨论的是Boost.Asio中的deadline_timer型。根据提供的引用内容,我们可以明确回答用户的问题。 引用[1]和[引用[2]都直接提到了boost::asio::deadline_timer,并说明它是Boost.Asio中提供的一种基于时间点的定时器。 引用[3]进一步说明:deadline_timer实际上是basic_deadline_timer的一个typedef,其定义为: typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer; 因此,deadline_timer确实是Boost.Asio中的一个型()。 另外,引用[4]也多次提到boost::asio::deadline_timer,并分析了其运行机制。 所以,我们可以肯定地回答用户:deadline_timer是Boost.Asio中的一个型)。 由于用户的问题很简单,我们只需直接给出答案,并简要引用相关段落作为依据。 注意:用户要求确认deadline_timer是否属于boost::asio中的型,我们回答“是”。 同时,按照要求,我们需要在回答末尾生成相关问题。</think>是的,`deadline_timer` 是 Boost.Asio中的核心型。根据提供的引用内容,可以明确以下几点: ### 关键确认点 1. **正式定义** `boost::asio::deadline_timer` 是 Boost.Asio 提供的标准定时器型,用于同步/异步时间操作[^1][^2]。 2. **型本质** 它实际上是模板 `basic_deadline_timer` 的别名: ```cpp typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer; ``` 这表明它是 Boost.Asio 型系统的正式组成部分[^3]。 3. **使用依赖** 其构造必须依赖 `io_service` 对象: ```cpp boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(5)); ``` 这进一步证实其属于 Boost.Asio 的核心设施[^2][^4]。 4. **功能实现** 通过 `deadline_timer_service` 与 I/O 服务(如 Windows 的 `win_iocp_io_service`)深度集成,实现定时队列管理和异步回调[^4]。 ### 核心功能总结 | 功能 | 描述 | |---------------|----------------------------------------------------------------------| | **同步等待** | 阻塞线程直到指定时间点(如 `timer.wait()`)[^1] | | **异步等待** | 注册回调函数,到期自动触发(如 `timer.async_wait(handler)`)[^1] | | **时间精度** | 基于 `boost::posix_time::ptime` 提供微秒级精度[^3] | | **跨平台** | 通过 `io_service` 抽象层适配不同系统的异步机制(如 IOCP)[^4] | > 示例:异步定时器使用 > ```cpp > void handler(const boost::system::error_code& ec) { > std::cout << "Timer expired!" << std::endl; > } > > boost::asio::io_service io; > boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3)); > timer.async_wait(&handler); // 注册异步回调 > io.run(); // 启动事件循环 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值