Boost下强大的asio

ASIO是一个很强大、高效的I/O异步跨平台库,之前就一直听闻其大名,但知道1.35版本才开始加入到了Boost里边,其文档也是比较全的,个人觉得看完自身附带的文档,就算是有个比较大概的了解了。 Overview部分的讲解是最重要的,好多概念性的东西都在这里介绍,包括其设计思路和概念表述。以前一直有前辈抱怨Linux平台上的select对于多路并发支持的羸弱,这次特意留心看了一下关于平台相关部分的实现描述,发现内部对于不同的操作系统,能用到的最有效的设施都用上了,例如Solaris平台上会调用/dev/poll, Linux 2.6则调用epoll, Windows上是Completion Port和Overlapped IO,BSD上是kqueue。

由于以前工作的时候,不时遇到过类似的复杂情况,所以个人最关心的部分当是它如何实现高效、灵活的异步模型,并灵活分发底层的线程驱动。初步看起来,asio好多地方和ACE都很形似,Proactor的描述也比较一致。ASIO的核心部分是一个io_service,其他的facility大多都需要带一个此对象实例的引用来实现相关部分的操作;核心的执行体部分则完全交给此类的run方法来驱动;有什么实际的work,只需要通过适当的接口递交给此io_service(implicit or explicit),这样实际上很方便的实现了业务逻辑和底层驱动的分离。

其实类似的思路以前我们Team讨论的时候也构思过类似的,但终因复杂度过高,使用和调试困难而夭折。当时记得遇到的最关键的问题就是底层驱动(run)执行work的时候,线程、同步这类讨厌的问题该如何处理。看了ASIO的strand方恍然大悟,它提供了很巧妙的异步之中的局部同步(严格说只是不交叉执行,因为底层库是不可能知道上层的执行先后关系的,这个肯定是用户的事情了),而且也很方便使用;用户只需要将自己需要同步执行的work用同一个strand对象给包一下就可以了,而且这个facility还比较巧妙的避开了mutex之类互斥措施的开销,实在是个不错的东西。
一个比较综合的实例,参考:
http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/tutorial/tutdaytime7.html
这里给出其简洁的main部分:
  1. int main()
  2. {
  3.   try
  4.   {
  5.     boost::asio::io_service io_service;
  6.     tcp_server server1(io_service);
  7.     udp_server server2(io_service);
  8.     io_service.run();
  9.   }
  10.   catch (std::exception& e)
  11.   {
  12.     std::cerr << e.what() << std::endl;
  13.   }
  14.   return 0;
  15. }


ASIO强大的地方还有很多,个人觉得最关键的是其背后的设计思想和实现手法,这些都值得有时间好好研究一番。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值