我已经开始N
个异步操作(例如N
对数据库的请求),所以我需要在所有这些操作结束后做一些事情。我怎么能这样做? (在一个异步操作结束后,我的回调将被调用)。
我用C ++ 14
示例
我使用boost.asio
将一些数据写入套接字。
for (int i = 0; i < N; ++i)
{
boost::asio::async_write(
m_socket,
boost::asio::buffer(ptr[i], len[i]),
[this, callback](const boost::system::error_code& ec, std::size_t )
{
callback(ec);
});
}
所以我需要知道我的所有写作何时结束;
答案 0 :(得分:2)
首先,永远不要在循环中调用async_write。每个套接字在任何时候都只能有一个async_write和一个async_read。
提升已经为scatter / gather io提供了条件。
此代码段应该为您提供足够的信息。
请注意,async_write可以将向量向量作为“缓冲区”,并且一旦所有缓冲区都被写入,它将只触发一次处理程序。
struct myclass {
boost::asio::ip::tcp::socket m_socket;
std::vector<std::vector<char>> pending_buffers;
std::vector<std::vector<char>> writing_buffers;
void write_all()
{
assert(writing_buffers.size() == 0);
writing_buffers = std::move(pending_buffers);
boost::asio::async_write(
m_socket,
boost::asio::buffer(writing_buffers),
std::bind(&myclass::write_all_handler,
this,
std::placeholders::_1,
std::placeholders::_2));
}
void write_all_handler(const boost::system::error_code& ec, size_t bytes_written)
{
writing_buffers.clear();
// send next load of data
if (pending_buffers.size())
write_all();
// call your callback here
}
};