boost 文档说取消的异步连接、发送和接收立即完成,取消操作的处理程序将传递 boost::asio::error::operation_aborted 错误。
我想知道取消的处理程序是否在其他(未取消的和新安排的)完成处理程序运行之前运行(并查看 operation_aborted 错误)。
这是我关心的时间表:
acceptHandler 和 readHandler 运行在同一个事件循环和同一个线程上。
是否可以在 t5 时在 newConnectionSocket 上下文中调用 readHandler,然后在 oldConnectionSocket 上下文中使用 operation_aborted 错误调用它?
取消的操作将立即发布其处理程序以进行延迟调用。但是,io_service不保证处理程序的调用顺序。因此,io_service可以选择以任一顺序调用 ReadHandlers。目前,只有 astrand指定在某些条件下保证排序。
在完成处理程序中,如果目标是知道哪个 I/O 对象与操作相关联,则考虑构造完成处理程序,以便它具有 I/O 对象的显式句柄。这通常使用以下任何一种方法来完成:
std::bind() 或者 boost::bind()一种常见的习惯用法是让 I/O 对象由继承自boost::enable_shared_from_this<>. 当一个类继承自 时boost::enable_shared_from_this,它提供一个shared_from_this()成员函数,该函数返回一个有效的shared_ptr实例给this。的副本shared_ptr传递给完成处理程序,例如 lambdas 中的捕获列表或作为实例句柄传递给boost::bind()。这允许处理程序知道在其上执行操作的 I/O 对象,并使 I/O 对象的生命周期延长至至少与处理程序一样长。有关使用此方法的示例,请参阅 Boost.Asio异步 TCP 日间服务器教程。
class tcp_connection
: public boost::enable_shared_from_this<tcp_connection>
{
public:
// ...
void start()
{
boost::asio::async_write(socket_, ...,
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_write(
const boost::system::error_code& error,
std::size_t bytes_transferred)
{
// I/O object is this->socket_.
}
tcp::socket socket_;
};
Run Code Online (Sandbox Code Playgroud)
另一方面,如果目标是确定一个处理程序是否在另一个之前执行,则:
| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |