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& io_context)
: service_(boost::asio::use_service<
boost::asio::detail::strand_service>(io_context))
{
service_.construct(impl_);
}
我想使用 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& io_context)
: service_(boost::asio::use_service<
boost::asio::detail::strand_service>(io_context))
{
service_.construct(impl_);
}