首頁 > 後端開發 > C++ > `boost::asio::io_service::run()` 何時阻塞?

`boost::asio::io_service::run()` 何時阻塞?

Linda Hamilton
發布: 2024-11-11 12:17:03
原創
496 人瀏覽過

When Does `boost::asio::io_service::run()` Block?

boost::asio::io_service何時運行阻塞/解除阻塞

io_service::run()的阻塞行為源自於它對工作和處理程序的處理。 它一直處於阻塞狀態,直到:

  • 所有工作已完成
  • 沒有更多處理程序可供執行
  • io_service 已停止透過stop()

破解短語「沒有更多處理程序要分派」

當io_service::run() 阻塞直到「沒有更多處理程序要分派」時,它表示沒有註冊回調形式的未完成任務。

範例程式碼中的行為

範例3a:阻塞

在第一個範例(3a) 中,io_service 阻塞在run() 內,直到所有三個已發布的斐波那契計算處理程序都已執行。

詳細執行流程:

  1. 建立 io_service::work 是為了防止 run() 立即返回。
  2. 啟動工作執行緒來執行 io_service 迴圈。
  3. 發布斐波那契計算的處理程序。
  4. io_service::work 重置,允許 run() 退出。
  5. 工作執行緒加入,指示任務完成。

客戶端程式碼:非同步但有效同步

客戶端程式碼似乎使用非同步I/O (async_receive),但它有效地同步運行:

執行流程:

  1. async_receive() 啟動非同步操作。
  2. io_service::run() 阻塞,直到操作完成或出現錯誤發生。
  3. 控制權回到呼叫線程,並且執行處理程序。

同步對應:

等效的同步操作將是:

boost::asio::error_code error;
std::size_t bytes = socket.receive(buffer, error);
// Execute handler with error and bytes
登入後複製

一般指南:分離同步與非同步操作

混合同步和非同步操作會帶來複雜性。考慮避免這種做法。 Boost.Asio 文件提供了有關非同步程式設計優勢的寶貴見解。

以上是`boost::asio::io_service::run()` 何時阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板