首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在asio堆叠的协同线中直接使用产卵安全吗?

在asio堆叠的协同线中直接使用产卵安全吗?
EN

Stack Overflow用户
提问于 2015-03-21 08:09:21
回答 1查看 1.8K关注 0票数 4

当我使用衍生开始一个新的堆满的协同线在一个协同线,瓦兰说很多使用未初始化的值(缬磨产量)。

然后,我使用io_service.post调用一个处理程序,并在其中启动一个新的堆栈式协同线,一切看起来都很好。

我已经搜索和阅读了一些文档,但是找不到关于如何在堆叠的协同线中安全地创建一个新的堆栈式协同线的内容。

以下是代码:

代码语言:javascript
运行
复制
#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 ProgrammingN4045和boost asio文档中找不到任何有用的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-21 18:30:21

这是安全的。

Boost.Asio对Boost.Coroutine的一流支持是一个很薄的外观,有两个值得注意的行为:

  • 恢复它的协同线和处理程序使用strand作为它们的执行上下文。这保证了合作线在屈服之前不会恢复。
  • 如果检测到没有可用的处理程序恢复协同线,则Boost.Asio将防止协同线无限期地挂起。当发生这种情况时,Boost.Asio将破坏协同线,导致挂起的堆栈展开。有关更多细节,请参见答案。

在上面的示例代码中,spawn(io_service&)重载导致产生的协同线有自己的strand。因此,如果多个线程正在运行io_service,那么每个协同线都可以并行运行,但不能保证这样做。另一方面,如果使用spawn(yield_context)重载,新的协同线将具有与调用协同线相同的执行上下文(即strand),从而防止并行执行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29180589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档