【问题标题】:boost.asio composed operation run in strandboost.asio 组合操作在 strand 中运行
【发布时间】:2016-10-02 22:51:24
【问题描述】:

代码:

在线程 1 中:

boost::async_read(socket, buffer, strand.wrap(read_handler));

在线程 2 中:

strand.post([](){socket.async_write_some(buffer, strand.wrap(write_handler))});

很明显,read_handlerasync_write_somewrite_handler受strand保护,不会并发。但是,async_read 是一个组合操作,它会调用 async_read_some 零次或多次,这些 async_read_some 也需要 strand 保护,否则它们可能与线程 2 中的 async_write_some 并发。

但是从代码来看,strand只包裹read_handler,asio如何让所有中间操作(async_read_some)也被strand包裹?

【问题讨论】:

    标签: boost-asio


    【解决方案1】:

    简而言之,asio_handler_invoke 使人们能够在不同处理程序的上下文中自定义处理程序的调用。在这种情况下,从strand.wrap() 返回的对象具有与之关联的自定义asio_handler_invoke 策略,该策略会将处理程序分派到包装初始处理程序的链中。概念上是这样的:

    template <typename Handler>
    struct strand_handler
    {
      void operator()();
      Handler handler_;
      boost::asio::strand dispatcher_;
    };
    
    // Customize invocation of Function within context of custom_handler.
    template <typename Function>
    void asio_handler_invoke(Function function, strand_handler* context)
    {
      context->dispatcher_.dispatch(function);
    }
    
    strand_handler wrapped_completion_handler = strand.wrap(completion_handler);
    using boost::asio::asio_handler_invoke;
    asio_handler_invoke(intermediate_handler, &wrapped_completion_handler);
    

    自定义asio_handler_invoke 挂钩通过argument-dependent lookup 定位。这个细节记录在Handler requirement:

    使函数对象f 像调用f() 一样被执行。

    asio_handler_invoke() 函数使用参数相关查找定位。如果没有用户提供的函数可用,函数 boost::asio::asio_handler_invoke() 将作为默认值。

    有关asio_handler_invoke 的更多详细信息,请考虑阅读this 答案。


    请注意,操作可能会在启动函数中尝试。文档具体说明中间 handlers 将在与最终完成处理程序相同的上下文中被调用。因此,给定:

    assert(strand.running_in_this_thread());
    boost::async_read(socket, buffer, strand.wrap(read_handler));
    

    boost::async_read 本身必须在strand 的上下文中调用才能保证线程安全。有关线程安全和股线的更多详细信息,请参阅this 答案。

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多