2009-12-30 217 views
14

我剛剛通過asio chat server example。我的問題是關於他們對io_service.run()函數的使用。對於io_service.run()函數的文檔說:boost asio io_service.run()

的run()函數阻塞,直到所有的工作已經完成,並且沒有 更多的處理程序被分派,或直至io_service對象已經 停止。多個線程可能會調用run()函數來設置一個線程池,io_service可以從中執行處理程序。在池中等待的所有 線程都是等效的,並且io_service 可以選擇其中任何一個來調用處理程序。只有在調用 reset()後,才能安全地調用run()函數 。

它說,run函數將返回,和我假設,當它返回的網線停止,直到再次被調用。如果那是真的,那麼爲什麼不是循環中調用的運行函數,或者至少給它自己的線程? io_service.run()函數對我來說是非常神祕的。

+0

檢查還答案在這裏: http://stackoverflow.com/questions/4705411/boostasio-io-service-run-vs-poll-or-how-do-i-integrate-boostasio-in -ma – serxio 2014-02-04 14:26:21

回答

19

「直到所有的工作已經完成,並沒有更多的處理程序被分派,或直至io_service對象已經停止」

請注意,您DO安裝一個處理器,命名爲handle_accept,在每個重新安裝本身執行。因此,io_service.run將永遠不會返回,至少在您手動退出之前。

基本上,目前在線程中運行io_service.run,io_services proactor使用您安裝的處理程序接管程序流程。從這一點開始,您將基於事件(如handle_accept)而不是正常的程序流程來處理程序。你提到的循環處於asio的proactor的可怕深處深處;-)。

+0

老問題,希望我會在這裏得到答覆,因爲這看起來相關。沒有接受處理程序的客戶情況如何?我試圖用asio編寫一個客戶端,並且陷入了io_service.run()適合的問題。 – Endophage 2011-11-12 06:11:02

+0

@Endophage,對不起,我使用boost :: asio已經很長時間了,所以我找不到來自我頭頂的答案,請嘗試重新提問。 – 2011-11-16 00:38:57

+0

沒問題,謝謝你的迴旋。 – Endophage 2011-11-16 17:58:05

相關問題