C ++等待所有异步操作结束

时间:2015-07-03 10:20:15

标签: c++ asynchronous boost boost-asio

我已经开始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);
            });
}

所以我需要知道我的所有写作何时结束;

1 个答案:

答案 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
    }
};