簡體   English   中英

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之間的區別。

我可以告訴自己為什么我的服務器需要異步,因為異步的要點是能夠同時處理許多不同連接上的大量數據。

但是當涉及到客戶端時,我真的只需要一個非阻塞線程,並且一個線程的異步不是沒用嗎? asio::connect是非阻塞同步,因為那是我真正需要的嗎? 如果是阻塞同步,那么我寧願選擇asio::async_connect 關於asio::async_readasio::async_write相同問題。

我使用的是 asio 1.18.1 獨立版本(無提升),我想知道 asio::connect 和 asio::async_connect 之間的區別。

asio::connect嘗試在調用點連接套接字,並會阻塞直到建立連接。 換句話說,如果解析一個 DNS 地址需要例如 20 秒,它將在整個持續時間內阻塞。

asio::async_connect將簡單地將連接請求排隊,並且在您調用io_context.run() (或其他函數,例如run_once()等)之前不會實際執行任何操作。

我可以告訴自己為什么我的服務器需要異步,因為異步的要點是能夠同時處理許多不同連接上的大量數據。

我既不能證實也不能否認。

但是當涉及到客戶端時,我真的只需要一個非阻塞線程,並且一個線程的異步不是沒用嗎?

不必要。 如果您想在同一線程上做其他事情,例如顯示連接進度、執行定期計時器或運行交互式 GUI 等。如果您調用asio::connect ,您的 GUI 將凍結,直到函數返回。 您可以選擇在與 GUI 不同的線程上調用asio::connect ,但是您需要擔心線程同步、鎖、互斥體等。

asio::connect 是非阻塞同步,因為那是我真正需要的嗎?

我不太明白這個問題,但是asio::connect正在阻塞。

如果是阻塞同步,那么我寧願選擇 asio::async_connect。 關於 asio::async_read 和 asio::async_write 的相同問題。

asio::connectasio::readasio::write都是阻塞的。 換句話說,它們將在調用點執行並阻塞直到完成。

asio::async_connectasio::async_readasio::async_write是它們的異步(非阻塞)對應物。 當您調用任何一個時,它們將排隊等待執行,並且一旦您調用io_context.run()就會被執行。 (我簡化了一點,但這是基本概念。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM