boost:asio与定时器

1059 篇文章 285 订阅

头文件

#include <boost/aiso/steady_timer.hpp>
#include <boost/aiso/system_timer.hpp>
#include <boost/aiso/high_resolution_timer.hpp>

理论

asio库提供四个定时器:

  • deadline_timer
  • steady_timer
  • system_timer
  • high_resolution_timer

这四个类的接口都是一样的,区别:

  • deadline_timer是asio早期版本提供的,使用boost.data_time提供时间支持。
  • steady_timer、system_timer、high_resolution_timer使用std::chrono或者boost::chrono时钟类提供时间支持

目标类basic_waitable_timer是定时器的真正实现,steady_timer、system_timer、high_resolution_timer是basic_waitable_timer的模板特化。
在这里插入图片描述

在这里插入图片描述

  • 定时器提供三种形式的构造参数:
    • 第一个:io_service,用于提交IO请求
    • 第二个:定时器的终止时间,可以是绝对时间点或者相对当前时间点的时间长度
  • 一旦定时创建,它就会马上开始计时,可以使用成员函数wait()来同步等待定时器终止,或者使用asyno_wait()异步等待
    • 当定时器到期时,会终止并调用handler函数
    • handler形式必须是: void handler(const error_code &ec);
    • 虽然asyno_wait()接受的回调函数类型是固定的,但是可以使用bind配合占位符placeholders::error来绑定参数来适配它的接口。
    • lambda表达式可以达到与bind相同的效果,由于它的捕获列表可以自动获得所有外部变量,所有写起来更方便更推荐
  • 如果定时器不指定终止时间,定时器就不会工作
    • 可以用成员函数expires_at()或者expires_from_now()分别设置定时器的终止时间点和相对时间,然后在调用wait()或者async_wait()等待
    • expires_at()或者expires_from_now()的无参形式可以用于获取定时器的终止时间
  • 其cancel()函数会传递error::operation_aborted错误码通知所有异步操作取消,返回已经取消的handler数量。cancel_one()同handler(),但是它一次只取消一个

同步定时器

实例

功能: 定时器同步等待500ms,当等待结束后输出一条消息

在这里插入图片描述

steady_timer VS sleep():

  • thread库的sleep()使用了互斥量和条件变量,在线程中等待
  • asio调用了操作系统的异步机制比如epoll完成的,没有多线程竞争

异步定时器

实例:

在这里插入图片描述
在这里插入图片描述

实例:异步连接服务器,如果超过500ms还没有连接成功,就关闭socket

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值