gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:51:31 25 4
gpt4 key购买 nike

我已经启动了 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);
});
}

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

最佳答案

首先,永远不要在循环中调用 async_write。每个套接字在任何时候可能只有一个 async_write 和一个 async_read 未完成。

boost 已经提供了分散/聚集 io。

这个片段应该给你足够的信息来继续。

请注意,async_write 可以将 vector 的 vector 作为“缓冲区”,一旦所有缓冲区都已写入,它就会恰好触发处理程序一次。

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

关于C++ 等待所有异步操作结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31204381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com