【问题标题】:How to use boost::asio::io_service::run_one()如何使用 boost::asio::io_service::run_one()
【发布时间】:2017-06-08 16:14:20
【问题描述】:

我正在阅读boost::asio::io_service::run_one() 并且对功能块的含义感到困惑。什么被阻止了,处理程序在哪里定义?

【问题讨论】:

    标签: exception boost boost-asio handler


    【解决方案1】:

    我正在阅读 boost::asio::io_service::run_one() 并且对功能块的含义感到困惑。什么被屏蔽了

    阻塞意味​​着run_one() 阻塞,直到它完成一个处理程序。

    处理程序在哪里定义?

    不是。 Logically it's described in the documentation。处理程序是服务中待处理的任何操作。所以,如果你这样做:

     void foo() { /*.... */ }
     void bar() { /*.... */ }
    
     io_service svc;
     svc.post(foo);
     svc.post(bar);
    

    现在是你第一次打电话

     svc.run_one();
    

    阻塞直到foo 完成。第二次

     svc.run_one();
    

    将阻塞直到bar 完成。之后,run_one() 将不会阻塞,只会返回 0。如果您让服务保持不变,例如:

     io_service::work keep_around(svc);
     svc.run_one();
    

    在发布其他操作之前会阻止。

    【讨论】:

    • 能否详细说明最后一个用例?
    • 链接的文档有,另见work。简短的总结是run*()poll*() 总是在所有工作完成后返回。 work 是一项“人造”工作,可以防止这种情况发生。它与答案本质上无关,只是添加,因为它表明run_one() 可以无限期阻塞,而不仅仅是运行特定任务的时间。
    • 对不起,您对链接文档有更清晰的解释吗?我可能不完全理解它,而且似乎我的 run_one() 实现确实无限期地阻塞了。
    • 你可能应该提出一个更清楚的问题 :) 看这里:stackoverflow.com/help/mcve
    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2015-04-22
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多