我为什么要使用io_service :: work?

时间:2012-11-04 14:13:58

标签: c++ boost boost-asio

我是boost编程的新手,我一直在寻找使用io_service::work的理由,但我无法弄明白;在我的一些测试中,我将其删除,正常工作

2 个答案:

答案 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