2012-11-04 19 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