#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
.