asio::async_write(m_socket, asio::buffer(buf, bytes),
custom_alloc(m_strand.wrap(custom_alloc(_OnSend))));
此代码是否保证async_write中的所有异步操作处理程序(对async_write_some的调用)都是通过strand调用的? (或者仅仅是 my_handler ?)
答案 0 :(得分:8)
使用以下代码:
asio::async_write(stream, ..., custom_alloc(m_strand.wrap(...)));
对于此组合操作,如果满足以下所有条件,则将在stream.async_write_some()
内调用m_strand
的所有调用:
发起async_write(...)
来电正在m_strand()
中运行:
assert(m_strand.running_in_this_thread());
asio::async_write(stream, ..., custom_alloc(m_strand.wrap(...)));
custom_alloc
的返回类型是:
template <typename Handler>
Handler custom_alloc(Handler) { ... }
自定义处理程序,适用于asio_handler_invoke()
的链调用:
template <class Handler>
class custom_handler
{
public:
custom_handler(Handler handler)
: handler_(handler)
{}
template <class... Args>
void operator()(Args&&... args)
{
handler_(std::forward<Args>(args)...);
}
template <typename Function>
friend void asio_handler_invoke(
Function intermediate_handler,
custom_handler* my_handler)
{
// Support chaining custom strategies incase the wrapped handler
// has a custom strategy of its own.
using boost::asio::asio_handler_invoke;
asio_handler_invoke(intermediate_handler, &my_handler->handler_);
}
private:
Handler handler_;
};
template <typename Handler>
custom_handler<Handler> custom_alloc(Handler handler)
{
return {handler};
}
答案 1 :(得分:3)
UPD:这个答案是错误的=)对于任何有兴趣的人,您都可以在评论的尾部查看详细信息,感谢 Tanner Sansbury 。
没有。这可以保证您的完成处理程序将通过 strand 锁定进行调用。这不包括对async_write_some
的调用。
此外,boost :: asio没有类似&#34;写队列&#34;并且您需要管理async_write
次来电以防止撰写混合内容。