gpt4 book ai didi

c++11 - 为什么在使用异步操作时没有堆栈溢出?

转载 作者:行者123 更新时间:2023-12-01 23:31:04 26 4
gpt4 key购买 nike

我正在使用 Boost.Asio用于学习异步操作。在阅读了很多关于这个概念的文章后,我仍然很困惑为什么这段代码是 Asio Docs 的 C++11 示例的一部分,为什么不会造成堆栈溢出?我只是无法想象这个地方的代码流程。它看起来如此递归,因为 do_accept();一次又一次地调用自己......我可以想象堆栈适用于 20 个客户端,但适用于 2000 个客户端?我认为对于异步操作,放置 acceptor_.async_accept() 更清楚在一个循环中并且在它内部没有递归调用。它会一样工作吗?

类员call_nr是我添加的用于测试目的。

编码:

class server
{
public:
server(boost::asio::io_service& io_service, short port)
: acceptor_(io_service, tcp::endpoint(tcp::v4(), port)),
socket_(io_service), call_nr(0)
{
do_accept();
}

private:
void do_accept()
{
acceptor_.async_accept(socket_,
[this](boost::system::error_code ec) // lambda equation
{
using namespace std;
cout << "Call nr " << (++call_nr) << endl;
if (!ec)
{
std::make_shared<session>(std::move(socket_))->start();
}

do_accept();
});
}

int call_nr;
tcp::acceptor acceptor_;
tcp::socket socket_;
};

最佳答案

回调 != 递归模式。

在幕后,Boost.Asio 与一些轮询对象一起工作,这些对象通知程序某些异步 IO 操作已完成。
在 Windows 上,我们谈论的是 IO 完成端口
在 Linux 上,我们谈论的是 epoll。

当异步 IO 操作完成时,轮询对象轮询一些控制块,其中包含有关已完成的 IO 操作的详细信息。
在 Windows 上,我们正在谈论 OVERLAPPED结构体。
在 Linux 上,我们谈论的是机器人 aiocb结构体。

Boost.Asio(以及其他平台,如 libuv/node.js、.Net、Java 等)继承自该控制块并向其添加其他内容。 Boost.Asio 添加回调对象。

所以当轮询对象轮询控制块时,Boost.Asio 会拉取回调并运行它。它可能会使用另一个回调启动另一个异步 IO 操作,但是当原始回调完成时,堆栈返回给调用者。该功能不会停留很长时间 - 即使启动了另一个 IO,该功能也会继续完成。

流程可能如下所示:

1) execute function A which reads file async
2) an asynchonous IO action is launched with a callback B
3) A continues to execute. it does not block since this is an async IO action
4) A finiehs to run and returns to the caller
5) some time later , the async IO finishes
6) IOCP/epoll polls the control block
7) the IOCP/epoll thread pulls callback B and execute it
8) callback B launches a new async IO action with callback C
9) B continues to execute, since the async IO doesn't block
10) B finished to run and returns to the caller
11) some time later, the Async IO is finished ... and so one

有关更多详细信息,请阅读有关 react 器模式的信息

关于c++11 - 为什么在使用异步操作时没有堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35727482/

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