【发布时间】:2015-05-24 16:36:52
【问题描述】:
当我使用 spawn 在协程中启动一个新的 stackfull 协程时,valgrind 说了很多使用未初始化的值(valgrind output)。
然后我使用 io_service.post 调用一个处理程序,并在其中启动一个新的 stackfull 协程,一切看起来都很好。
我已经搜索并阅读了一些文档,但找不到有关如何在 stackfull 协程中安全地创建新的 stackfull 协程的内容。
代码如下:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/system_timer.hpp>
#include <chrono>
using namespace std;
int main()
{
auto use_post = false;
boost::asio::io_service io_service;
boost::asio::spawn(io_service,
[&io_service, &use_post](boost::asio::yield_context yield){
if(use_post){
io_service.post([&io_service]{
boost::asio::spawn(io_service, [&io_service](boost::asio::yield_context yield){
boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(1));
timer.async_wait(yield);
cout << "Sleep 1 second" << endl;
});
});
}
else{
boost::asio::spawn(io_service, [&io_service](boost::asio::yield_context yield){
boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(1));
timer.async_wait(yield);
cout << "Sleep 1 second" << endl;
});
}
boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(2));
timer.async_wait(yield);
cout << "Sleep 2 seconds" << endl;
});
io_service.run();
return 0;
}
将use_post变量设置为true,新的stackfull协程将通过post + spawn启动。
可能是我没有仔细阅读文档,在Boost.Asio C++ Network Programming、N4045和boost asio文档中找不到任何有用的东西。
【问题讨论】:
标签: c++ boost boost-asio coroutine