Разница между boost::asio::strand и boost::asio::io_context::strand

#c #boost #asio

Вопрос:

Я хотел бы сериализовать запросы http post с помощью strand, чтобы избежать перекрывающихся записей в сеть.

Мой подход состоял в том, чтобы вызвать post метод из strand объекта с обратным вызовом, который отправляет данные, как показано в следующем коде :

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

Однако, посмотрев на некоторые примеры, я заметил 2 типа определений нитей :

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

Есть идеи, чем отличается каждый тип ?

Ответ №1:

На самом деле между ними нет большой разницы. На самом деле у них много общего кода, и это показывает, что один был создан из другого.

Смотрите разницу здесь (bosst 1.67).

Однако, boost::asio::strand если шаблон класса изначально предназначался для использования с 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())
  {
  }
 

Класс boost::asio::io_context::strand не является шаблоном класса и привязан к классу 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_contextamp;amp; io_context)
    : service_(boost::asio::use_serviceamp;<
        boost::asio::detail::strand_serviceamp;>(io_context))
  {
    service_.construct(impl_);
  }
 

Комментарии:

1. Привет и спасибо за помощь. Тем не менее, я все еще не понимаю, какой тип использовать для моей необходимости сериализации http-записей. Может быть, вы можете подробнее остановиться на этом ?

2. Учитывая, что оба они довольно похожи, я бы пошел, boost::asio::io_context::strand потому что он явно предназначен для boost::asio::io_context .