7

我是 boost 编程的新手,我一直在寻找使用 的理由io_service::work,但我想不通;在我的一些测试中,我删除了它并且工作正常。

4

2 回答 2

11

io_service::run()只要有异步操作要执行,就会运行操作。如果在任何时候都没有异步操作挂起(或正在调用的处理程序),则run()调用将返回。

但是,有些设计希望在run()完成所有工作io_service并且明确指示可以退出之前调用不退出。这io_service::work就是用途。通过创建work对象(我通常在堆和 shared_ptr 上创建),io_service 认为自己总是有一些待处理的东西,因此该run()方法不会返回。一旦我希望服务能够退出(通常在关闭期间),我将销毁工作对象。

于 2012-11-04T14:24:40.303 回答
7

io_service::work是所有可以io_service发布workio_service. 所以你通常从不work直接使用,但有一个例外:

io_service::run一旦没有更多工作要做就会返回,所以考虑一个有一些生产者和消费者线程的应用程序,生产者偶尔会产生工作并将它们发布到消费者线程io_service::post,但如果所有工作完成,那么io_service::run将返回并且可能是你的消费者线程将被停止,所以你需要一个任意的工作来保持io_service忙碌,这种情况下你可以io_service::work直接使用。

于 2012-11-04T14:27:00.193 回答