boost asio

Basics

  1. 线程提交请求后,系统异步执行IO,而线程继续,当系统执行完成,会调用回调函数
  2. io_service.run()可以多个线程执行,回调函数会在其中一个线程上执行,未必是提交异步I/O的线程
  3. 如果不调用run,回调函数永远不会执行。

线程安全

  • socket:socket类不是线程安全的。 所以, 你要避免在某个线程里读一个socket
    时, 同时在另外一个线程里面对其进行写入操作。 ( 通常来说这种操作都是不
    推荐的, 更别说Boost.Asio) 。
  • io_service:io_service是线程安全的

I/O成员函数与普通函数

  • boost::asio::read 读到指定长度时,就会返回,你需要知道你想读多少
  • socket.read_some 一旦读到一些数据就会返回,所以必须放在循环里,然后手动判断是否已经读到想要的长度。

程序退出

如果你想要service.run()接着执行,你需要分配更多的工作给它。这里有两个方式来完成这个目标。

  1. 在connect_handler中启动另外一个异步操作来分配更多的工作。

  2. 模拟一些工作给它,用下面的代码片段:

    typedef boost::shared_ptr work_ptr;
    work_ptr dummy_work(new io_service::work(service));
    

    上面的代码可以保证service.run()一直运行直到你调用useservice.stop()或者 dummy_work.reset(0);// 销毁 dummy_work.

错误检查

异步函数:在回调函数中检查错误
同步函数:抛出异常或者返回错误码的重载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值