gpt4 book ai didi

c++ - asio::async_write 和 strand

转载 作者:太空狗 更新时间:2023-10-29 19:48:02 24 4
gpt4 key购买 nike

asio::async_write(m_socket, asio::buffer(buf, bytes),
custom_alloc(m_strand.wrap(custom_alloc(_OnSend))));

这段代码是否保证 async_write 中的所有异步操作处理程序(对 async_write_some 的调用)都通过 strand 调用? (或者它只是为了 my_handler?)

最佳答案

使用以下代码:

asio::async_write(stream, ..., custom_alloc(m_strand.wrap(...)));

对于这个组合操作,如果以下所有条件都为真,所有对 stream.async_write_some() 的调用都将在 m_strand 中调用:

  • 启动 async_write(...) 调用在 m_strand() 中运行:

    assert(m_strand.running_in_this_thread());
    asio::async_write(stream, ..., custom_alloc(m_strand.wrap(...)));
  • custom_alloc 的返回类型是:

    • strand::wrap() 返回的确切类型

      template <typename Handler> 
      Handler custom_alloc(Handler) { ... }
    • 一个自定义处理程序,用于适本地链式调用 asio_handler_invoke() :

      template <class Handler>
      class custom_handler
      {
      public:
      custom_handler(Handler handler)
      : handler_(handler)
      {}

      template <class... Args>
      void operator()(Args&&... args)
      {
      handler_(std::forward<Args>(args)...);
      }

      template <typename Function>
      friend void asio_handler_invoke(
      Function intermediate_handler,
      custom_handler* my_handler)
      {
      // Support chaining custom strategies incase the wrapped handler
      // has a custom strategy of its own.
      using boost::asio::asio_handler_invoke;
      asio_handler_invoke(intermediate_handler, &my_handler->handler_);
      }

      private:
      Handler handler_;
      };

      template <typename Handler>
      custom_handler<Handler> custom_alloc(Handler handler)
      {
      return {handler};
      }

参见 this回答有关链的更多详细信息,以及this回答有关 asio_handler_invoke 的详细信息。

关于c++ - asio::async_write 和 strand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36016135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com