2012-11-04 37 views

回答

9

io_service::run()將運行操作。如果在任何時候沒有未處理的異步操作(或正在調用處理程序),則將返回run()調用。

但是,有些設計更希望run()調用不會退出,直到完成所有工作,並且明確指示io_service可以退出。這就是io_service::work的用途。通過創建work對象(我通常做它的堆和一個shared_ptr)函數,io_service對象認爲自己總是有一些懸而未決,因此run()方法將不會返回。一旦我希望服務能夠退出(通常在關閉期間),我將銷燬工作對象。

+0

銷燬喜歡使用復位()? – lucastamoios

+2

通常情況下,如果我用一個shared_ptr工作,那麼是的,我稱之爲'復位()'上的shared_ptr。 –

6

io_service::work是基類,可以發佈到的io_service一個實例,例如,當您正在使用一個插座的工作,並開始異步讀取所有作品,實際上添加的是workio_service。所以,你通常不會使用work直接,但有一個例外:

io_service::run將盡快,因爲沒有更多的工作要做回報,所以認爲有一些生產者和消費者線程的應用程序,生產者偶爾產生的作品並將其張貼到消費者線程與io_service::post,但如果所有的作品完成了,那麼io_service::run將返回,可能你的消費者線程將被停止,所以你需要一個任意的工作,以保持io_service忙,在這種情況下,你可以直接使用io_service::work