题
什么时候需要asio_handler_invoke通过简单地包装处理程序来实现无法实现的功能?
演示需要的情况的典型示例asio_handler_invoke将是理想的.
背景
boost asio docs包含了一个如何在asio_handler_invoke 这里使用的例子,但我认为它不是一个令人信服的例子,说明为什么要使用调用处理程序.在该示例中,您似乎可以进行如下更改(并删除asio_handler_invoke)并获得相同的结果:
template <typename Arg1>
void operator()(Arg1 arg1)
{
queue_.add(priority_, std::bind(handler_, arg1));
}
Run Code Online (Sandbox Code Playgroud)
同样,在我关于处理程序跟踪的答案中asio_handler_invoke,尽管Tanner Sansbury的回答建议使用调用挂钩作为解决方案,但同样似乎没有必要使用它.
boost用户组上的这个线程提供了更多信息 - 但我不明白其意义.
从我所看到的,它似乎asio_handler_invoke总是被称为asio_handler_invoke(h, &h),似乎没有多大意义.在什么情况下,参数不是(基本上)相同对象的副本?
最后一点 - 我只是io_service::run()从一个线程调用,所以可能是我遗漏了一些来自多线程循环经验的明显东西.
是否boost::asio::io_service保证以与通过它们给出的顺序相同的方式调用处理程序post()?我在文档中找不到任何说法.假设调用io_service::post是序列化的.
asio::async_write(m_socket, asio::buffer(buf, bytes),
custom_alloc(m_strand.wrap(custom_alloc(_OnSend))));
Run Code Online (Sandbox Code Playgroud)
此代码是否保证async_write中的所有异步操作处理程序(对async_write_some的调用)都是通过strand调用的?(或者只是为了my_handler?)