当我使用衍生开始一个新的堆满的协同线在一个协同线,瓦兰说很多使用未初始化的值(缬磨产量)。
然后,我使用io_service.post调用一个处理程序,并在其中启动一个新的堆栈式协同线,一切看起来都很好。
我已经搜索和阅读了一些文档,但是找不到关于如何在堆叠的协同线中安全地创建一个新的堆栈式协同线的内容。
以下是代码:
#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
变量,新的堆栈完整的协同将启动后+产卵。
也许我没有仔细阅读这些文档,在Boost.Asio C++ Network Programming
、N4045
和boost asio文档中找不到任何有用的东西。
发布于 2015-03-21 18:30:21
这是安全的。
Boost.Asio对Boost.Coroutine的一流支持是一个很薄的外观,有两个值得注意的行为:
strand
作为它们的执行上下文。这保证了合作线在屈服之前不会恢复。在上面的示例代码中,spawn(io_service&)
重载导致产生的协同线有自己的strand
。因此,如果多个线程正在运行io_service
,那么每个协同线都可以并行运行,但不能保证这样做。另一方面,如果使用spawn(yield_context)
重载,新的协同线将具有与调用协同线相同的执行上下文(即strand
),从而防止并行执行。
https://stackoverflow.com/questions/29180589
复制相似问题