我是boost编程的新手,我一直在寻找使用io_service::work
的理由,但我无法弄明白;在我的一些测试中,我将其删除,正常工作。
答案 0 :(得分:10)
只要有要执行的异步操作,io_service::run()
就会运行操作。如果在任何时候没有异步操作挂起(或调用处理程序),则run()
调用将返回。
但是,有些设计更倾向于run()
调用在完成所有工作之前不会退出并且io_service
已明确指示可以退出。这就是io_service::work
的用途。通过创建work
对象(我通常在堆上执行它和shared_ptr),io_service认为自己总是有待处理的东西,因此run()
方法不会返回。一旦我希望服务能够退出(通常在关机期间),我将销毁工作对象。
答案 1 :(得分:7)
io_service::work
是可以发布到io_service
实例的所有工作的基类,例如当您使用套接字并启动异步读取时,实际上您正在添加{{1}到work
。所以你通常不会直接使用io_service
,但有一个例外:
work
就会返回,所以请考虑一个具有生产者和消费者线程的应用程序,生产者偶尔会生成作品并将其发布到io_service::run
的消费者线程,但是如果所有工作都完成了,那么io_service::post
将会返回,并且您的消费者线程可能会被停止,因此您需要任意工作以保持io_service::run
忙,在这种情况下您可以直接使用io_service