我使用的是ASIO1.18.1独立版本(没有助推),我想知道asio::connect和asio::async_connect之间的区别。
我可以告诉自己为什么我的服务器需要异步,因为异步的要点是能够同时处理许多不同连接上的大量数据。
但是,当涉及到客户端时,我真的只需要一个非阻塞线程,而异步对于一个线程是否没有用呢?asio::connect是一种非阻塞同步,因为这正是我真正需要的吗?如果是阻塞同步,那么我宁愿选择asio::async_connect。关于asio::async_read和asio::async_write的同样的问题。
发布于 2021-07-01 00:21:38
我使用的是ASIO1.18.1独立版本(没有助推),我想知道asio::connect和asio::async_connect之间的区别。
asio::connect试图在调用点连接套接字,并将阻塞,直到连接建立为止。换句话说,如果解析DNS地址需要20秒的时间,它将在整个过程中被阻塞。
asio::async_connect将简单地将连接请求排队起来,在调用io_context.run() (或其他函数,如run_once()等)之前不会实际执行任何操作。
我可以告诉自己为什么我的服务器需要异步,因为异步的要点是能够同时处理许多不同连接上的大量数据。
我既不能证实也不能否认这一点。
,但是当涉及到客户端时,我真的只需要一个非阻塞线程,而且异步对于一个线程来说不是无用的吗?
不一定。如果你想在同一个线程上做其他事情,比如显示连接进度,执行周期性计时器或运行交互式图形用户界面等等。如果你调用asio::connect,你的图形用户界面会冻结,直到函数返回。您可以选择在一个单独的线程上调用asio::connect,而不是您的GUI,但是接下来您需要考虑线程同步、锁、互斥等等。
是asio::连接非阻塞同步,因为这正是我真正需要的?
我不太明白这个问题,但是asio::connect阻止了。
如果它是阻塞同步,那么我宁愿选择asio::async_connect。关于asio::async_read和asio::async_write的同样的问题。
asio::connect,asio::read和asio::write都是阻塞的。换句话说,它们将在调用点执行,并阻塞直到完成。
asio::async_connect、asio::async_read和asio::async_write是它们的异步(非阻塞)对应体.当您调用任何一个时,它们都将排队等待执行,并且在调用io_context.run()后将被执行。(我只是在简化一点,但这是基本概念。)
https://stackoverflow.com/questions/68202240
复制相似问题