大佬教程收集整理的这篇文章主要介绍了c – boost :: asio :: spawn有什么作用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
>当我调用spawn(io_service,my_coroutInE)时,它是否会向io_service队列@L_262_1@一个新的处理程序来包装对my_coroutIne的调用?
>当在协同程序中我调用异步函数传递我的yield_context时,是否挂起协同程序直到异步操作完成?
void my_coroutIne(yield_context yield) { ... async_foo(params ...,yield); ... // control comes here only once the async_foo operation completes }
我不明白的是我们如何避免等待.假设my_coroutIne服务于TCP连接,在特定实例挂起时,如何@L_104_0@my_coroutIne的其他实例,等待async_foo完成?
>当调用spawn()
时,Boost.Asio执行一些设置工作,然后将使用strand
到dispatch()
内部处理程序,该处理程序使用用户提供的函数作为入口点创建协同程序.在某些条件下,可以在对spawn()的调用中调用内部处理程序,有时将其发布到io_service以进行延迟调用.
>协程暂停,直到操作完成并调用完成处理程序,io_service被销毁,或者Boost.Asio检测到协程已被挂起而无法恢复它,此时Boost.Asio将破坏协同程序.
如上所述,当调用spawn()时,然后使用strand来调度()内部处理程序,该处理程序使用用户提供的函数作为入口点创建协同程序.当yield_context对象作为处理程序传递给异步操作时,Boost.Asio将在使用完成处理程序启动异步操作后立即生成,该处理程序将复制结果并恢复协程.前面提到的链是由coroutIne所有,用于保证在恢复之前产生的产量.让我们考虑一个简单的例子demonstrating spawn():
#include <iostream> #include <boost/asio.hpp> #include <boost/asio/spawn.hpp> boost::asio::io_service io_service; void other_work() { std::cout << "Other work" << std::endl; } void my_work(boost::asio::yield_context yield_context) { // Add more work to the io_service. io_service.post(&other_work); // Wait on a timer within the coroutIne. boost::asio::deadline_timer timer(io_servicE); timer.expires_from_Now(boost::posix_time::seconds(1)); std::cout << "Start wait" << std::endl; timer.async_wait(yield_context); std::cout << "Woke up" << std::endl; } int main () { boost::asio::spawn(io_service,&my_work); io_service.run(); }
以上示例输出:
Start wait Other work Woke up
这是尝试说明示例的执行.路径|表示活动堆栈,:表示挂起的堆栈,箭头用于表示控制转移:
boost::asio::io_service io_service; boost::asio::spawn(io_service,&my_work); `-- dispatch a coroutIne creator into the io_service. io_service.run(); |-- invoke the coroutIne creator | handler. | |-- create and jump into | | into coroutIne ----> my_work() : : |-- post &other_work onto : : | the io_service : : |-- create timer : : |-- set timer expiration : : |-- cout << "Start wait" << endl; : : |-- timer.async_wait(yield) : : | |-- create error_code on stack : : | |-- initiate async_wait operation,: : | | passing in completion handler that : : | | will resume the coroutIne | `-- return <---- | |-- yield |-- io_service has work (the : : | &other_work and async_wait) : : |-- invoke other_work() : : | `-- cout << "Other work" : : | << endl; : : |-- io_service still has work : : | (the async_wait operation) : : | ...async wait completes... : : |-- invoke completion handler : : | |-- copies error_code : : | | provided by service : : | | into the one on the : : | | coroutIne stack : : | |-- resume ----> | `-- return error code : : |-- cout << "Woke up." << endl; : : |-- exiTing my_work block,timer is : : | destroyed. | `-- return <---- `-- coroutIne done,yielding `-- no outstanding work in io_service,return.
以上是大佬教程为你收集整理的c – boost :: asio :: spawn有什么作用?全部内容,希望文章能够帮你解决c – boost :: asio :: spawn有什么作用?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。