我是 boost 编程的新手,我一直在寻找使用 的理由io_service::work
,但我想不通;在我的一些测试中,我删除了它并且工作正常。
问问题
3652 次
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
发布work
到io_service
. 所以你通常从不work
直接使用,但有一个例外:
io_service::run
一旦没有更多工作要做就会返回,所以考虑一个有一些生产者和消费者线程的应用程序,生产者偶尔会产生工作并将它们发布到消费者线程io_service::post
,但如果所有工作完成,那么io_service::run
将返回并且可能是你的消费者线程将被停止,所以你需要一个任意的工作来保持io_service
忙碌,这种情况下你可以io_service::work
直接使用。
于 2012-11-04T14:27:00.193 回答