浅析boost::asio::deadline_timer运行机制

https://blog.csdn.net/k1988/article/details/5586926

在使用到deadline_timer时,我需要同时使io_serivice的post函数以及使用timer的async_wait,但是我不清楚async_wait是否准确地在它等待的时刻进行回调。于是我做了一个实验。

[c-sharp] view plain copy

    #include <boost/cstdint.hpp>  
    #include <boost/bind/bind.hpp>  
     
    #include <boost/asio/io_service.hpp>  
    #include <boost/asio/strand.hpp>  
    #include <boost/asio/deadline_timer.hpp>  
     
    #include <boost/thread/thread.hpp>  
    #include <boost/thread/detail/thread_group.hpp>  
     
    #include <boost/shared_ptr.hpp>  
     
    #define STDCALL _stdcall  
      
    void wait(int nSeconds)  
    {  
        printf("wait %d begin.../n", nSeconds);  
        boost::this_thread::sleep( boost::posix_time::seconds(nSeconds));  
        printf("wait %d end.../n", nSeconds);  
    };  
      
      
    int main(int argc, char* argv[])  
    {  
        boost::asio::io_service service;  
        boost::asio::io_service::work work(service);  
      
        boost::asio::deadline_timer t(service);   
        boost::thread td(boost::bind(&boost::asio::io_service::run, &service ));  
      
        t.expires_from_now(boost::posix_time::milliseconds(0));  
        service.post(boost::bind(wait, 2));  
        t.async_wait(boost::bind(wait, 1));///<无论此句放在哪里,都是在run之后才会将t的handler放到service的处理队列中  
        service.post(boost::bind(wait, 2));  
        service.post(boost::bind(wait, 2));  
        service.post(boost::bind(wait, 2));  
      
        td.join();  
      
        return 0;  

    在windows下,io_service的实现是win_iocp_io_service,win_iocp_io_service使用了ICOP实现异步机制。win_iocp_io_service的post函数最终是使用PostQueuedCompletionStatus处理,好比是直接加入了待运行列表,而boost::asio::deadline_timer的机制就稍复杂,boost::asio::deadline_timer需要一个io_service做为参数,并且会使用这个参数来构建一个deadline_timer_service,deadline_timer_service里有一个timer_queue_用来储存所有的timer,并且在deadline_timer_service构造时会将timer_queue_使用io_service::add_timer_queue传入win_iocp_io_service。在win_iocp_io_service的do_one中会查询所有的timer_queue_,并且判断其中的timer是否到期,如果到期则将其中的函数对象加入待运行列表。
    所以在上例中,无论 t.async_wait(handler)在哪里调用,handler都会比其它的使用post传入handler晚调用,原因是service运行时post传入的handler已经在运行队列中了,等到timer到期时,t.async_wait传入的handler被加在了队尾,所以t.async_wait(handler)中handler被调用的时间应该是timer的时间+timer到期时整个命令序列执行时需要的时间长度。
--------------------- 
作者:k1988 
来源:CSDN 
原文:https://blog.csdn.net/k1988/article/details/5586926 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
boost::asio::high_resolution_timer是一个定时器类,用于在boost::asio库中进行高分辨率的定时操作。 boost::asio库是一个用于网络和异步编程的C++库。它提供了丰富的功能,包括异步IO操作、定时器、socket通信等。其中,boost::asio::high_resolution_timer是其中的一个定时器类,它使用了高分辨率的时钟来进行精确的定时操作。 使用boost::asio::high_resolution_timer,我们可以创建一个定时器对象,并设置定时的时间间隔。可以使用成员函数expires_from_now()指定定时的时间间隔,参数为一个duration类型的对象,表示时间间隔的长度。 例如,以下代码创建了一个定时器对象timer,设置了定时时间间隔为1秒: boost::asio::high_resolution_timer timer(io_context); timer.expires_from_now(boost::posix_time::seconds(1)); 然后,我们可以调用定时器对象的async_wait()函数来启动定时器,并指定一个回调函数,在定时器超时时被调用。回调函数可以是一个lambda函数,也可以是一个函数对象。 例如,以下代码定义了一个lambda函数作为回调函数: timer.async_wait([](const boost::system::error_code& ec) { if (!ec) { // 定时器超时,执行相应操作 } }); 在定时器超时时,回调函数会被触发,并执行相应操作。 总之,boost::asio::high_resolution_timer是一个用于高分辨率定时操作的定时器类,可以帮助我们在异步编程中进行精确的定时操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值