asio::async_connect 对比 asio::connect。 asio::connect 是非阻塞同步吗?

asio::async_connect vs asio::connect. Is asio::connect a non-blocking sync?

我使用的是 asio 1.18.1 独立版本(没有提升),我想知道 asio::connectasio::async_connect 之间的区别。

我可以告诉自己为什么我的服务器需要异步,因为异步的意义在于能够同时处理大量不同连接上的大量数据。

但是对于客户端来说,我真的只需要一个非阻塞线程,而只有一个线程的async不是没用吗? asio::connect 是非阻塞同步吗,因为那是我真正需要的?如果是阻塞同步,那么我宁愿选择asio::async_connect。关于 asio::async_readasio::async_write 的相同问题。

I'm using the asio 1.18.1 standalone version (no boost) and I wonder about the difference between asio::connect and asio::async_connect.

asio::connect 尝试在调用点连接套接字并将阻塞直到建立连接。换句话说,如果解析一个 DNS 地址需要 20 秒,它将在整个持续时间内阻塞。

asio::async_connect 只会将连接请求排队,在您调用 io_context.run()(或其他函数,例如 run_once() 等)之前不会实际执行任何操作。

I can tell myself why I need async for my server, because the point of async is being able to deal with a lot of data on a lot of different connections at the same time.

我既不能证实也不能否认。

But when it comes to the client, I really need just one non-blocking thread and isn't async for just one thread useless?

不一定。如果你想在同一个线程上做其他事情,例如显示连接进度,执行周期性计时器或 运行 交互式 GUI 等。如果你调用 asio::connect,你的 GUI 将冻结直到函数 returns.您可以选择在与 GUI 不同的线程上调用 asio::connect,但是您需要担心线程同步、锁、互斥等问题。

Is asio::connect a non-blocking sync, because that's what I really need?

这个问题我不是很懂,但是asio::connect卡住了

If it's a blocking sync, then I would rather choose the asio::async_connect. Same question about asio::async_read and asio::async_write.

asio::connectasio::readasio::write都是阻塞的。换句话说,它们将在调用点执行并阻塞直到完成。

asio::async_connectasio::async_readasio::async_write 是它们的异步(非阻塞)对应物。当您调用其中任何一个时,它们将排队等待执行,并在您调用 io_context.run() 后执行。 (我简化了一点,但这是基本概念。)