boost::asio::strand 和 boost::asio::io_context::strand 之间的区别

Difference between boost::asio::strand and boost::asio::io_context::strand

我想使用 strand 序列化 http post 请求,以避免重叠写入网络。

我的方法是使用发送数据的回调从 strand 对象调用 post 方法,如下面的代码所示:

void Send(
   boost::beast::http::request<boost::beast::http::string_body> &req) {
  strand_.post([=]() {
      ...
      boost::beast::http::write(stream_, req);
      ...
  }

但是,通过查看一些示例,我注意到了两种类型的链定义:

boost::asio::strand<boost::asio::io_context::executor_type> strand_;
boost::asio::io_context::strand strand_;

知道每种类型之间有什么不同吗?

它们之间其实并没有太大区别。事实上,他们共享很多代码,这表明一个是从另一个创建的。

参见差异 here(boss 1.67)。

但是,boost::asio::strand 是一个 class 模板,最初打算与 asio::io_service 一起使用:

template <typename Executor>;
class strand
{
public:
  /// The type of the underlying executor.
  typedef Executor inner_executor_type;

  /// Default constructor.
  /**
   * This constructor is only valid if the underlying executor type is default
   * constructible.
   */
  strand()
    : executor_(),
      impl_(use_service<detail::strand_executor_service>(
            executor_.context()).create_implementation())
  {
  }

class boost::asio::io_context::strand 不是 class 模板并且绑定到 class boost::asio::io_context:

class io_context::strand
{
public:
  /// Constructor.
  /**
   * Constructs the strand.
   *
   * @param io_context The io_context object that the strand will use to
   * dispatch handlers that are ready to be run.
   */
  explicit strand(boost::asio::io_context&amp; io_context)
    : service_(boost::asio::use_service&lt;
        boost::asio::detail::strand_service&gt;(io_context))
  {
    service_.construct(impl_);
  }