Basics
- 线程提交请求后,系统异步执行IO,而线程继续,当系统执行完成,会调用回调函数
- io_service.run()可以多个线程执行,回调函数会在其中一个线程上执行,未必是提交异步I/O的线程
- 如果不调用run,回调函数永远不会执行。
线程安全
- socket:socket类不是线程安全的。 所以, 你要避免在某个线程里读一个socket
时, 同时在另外一个线程里面对其进行写入操作。 ( 通常来说这种操作都是不
推荐的, 更别说Boost.Asio) 。 - io_service:io_service是线程安全的
I/O成员函数与普通函数
boost::asio::read
读到指定长度时,就会返回,你需要知道你想读多少socket.read_some
一旦读到一些数据就会返回,所以必须放在循环里,然后手动判断是否已经读到想要的长度。
程序退出
如果你想要service.run()接着执行,你需要分配更多的工作给它。这里有两个方式来完成这个目标。
-
在connect_handler中启动另外一个异步操作来分配更多的工作。
-
模拟一些工作给它,用下面的代码片段:
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.
错误检查
异步函数:在回调函数中检查错误
同步函数:抛出异常或者返回错误码的重载