gpt4 book ai didi

c++ - asio::use_future 和事件循环

转载 作者:行者123 更新时间:2023-11-30 01:44:41 25 4
gpt4 key购买 nike

我正在浏览 asio 功能 use_future,阅读 source code .

但无法弄清楚它是如何工作的。说,如果我打电话

auto fut = async_write(sock, buffer, use_future)

fut 变为 std::future(根据源代码)。现在,如果我调用 fut.get(),我应该能够等待异步操作完成并获得返回值。在 use_future.hpp 文件中,我看到了 asio async_result 处理程序解析等标准。

但是如果我阻止 future::get() 调用,IO 循环如何继续工作以便完成操作?它是否创建系统线程?

最佳答案

亚西欧 tutorial提到对于单线程应用程序,如果处理程序需要很长时间才能完成,人们可能会观察到响应性差。在这种情况下,如果只有一个线程正在处理 io_service , 然后就会观察到死锁。

boost::asio::use_future 使用时,启动操作将:

  • 使用完成处理程序启动基础操作,该处理程序将在 std::promise 上设置值或错误
  • 返回给调用者一个std::futurestd::promise 相关联.

如果单个线程正在处理 I/O 服务,并且它阻塞在 future::get() 上,然后是将设置 std::promise 的完成处理程序永远不会被调用。防止这种情况发生是应用程序的责任。 official futures example通过创建一个专用于处理 I/O 服务并等待 std::future 的额外线程来完成此操作来自不处理 I/O 服务的线程。

// We run the io_service off in its own thread so that it operates
// completely asynchronously with respect to the rest of the program.
boost::asio::io_service io_service;
boost::asio::io_service::work work(io_service);
std::thread thread([&io_service](){ io_service.run(); });

std::future<std::size_t> send_length =
socket.async_send_to(..., boost::asio::use_future);

// Do other things here while the send completes.

send_length.get(); // Blocks until the send is complete. Throws any errors.

关于c++ - asio::use_future 和事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35710080/

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