相关疑难解决方法(0)

使用boost :: asio时,为什么每个连接需要strand?

我正在审查Boost网站上的HTTP Server 3示例.

你能解释我为什么需要strand每个连接吗?正如我所看到的,我们read_some只在read-event的处理程序中调用.所以基本上read_some调用是顺序的,因此不需要strand(第3段的第2项说同样的事情).多线程环境中的风险在哪里?

c++ boost boost-asio

43
推荐指数
2
解决办法
2万
查看次数

何时使用`asio_handler_invoke`?

什么时候需要asio_handler_invoke通过简单地包装处理程序来实现无法实现的功能?

演示需要的情况的典型示例asio_handler_invoke将是理想的.

背景

boost asio docs包含了一个如何asio_handler_invoke 这里使用的例子,但我认为它不是一个令人信服的例子,说明为什么要使用调用处理程序.在该示例中,您似乎可以进行如下更改(并删除asio_handler_invoke)并获得相同的结果:

template <typename Arg1>
void operator()(Arg1 arg1)
{
  queue_.add(priority_, std::bind(handler_, arg1));
}
Run Code Online (Sandbox Code Playgroud)

同样,在我关于处理程序跟踪答案中asio_handler_invoke,尽管Tanner Sansbury的回答建议使用调用挂钩作为解决方案,但同样似乎没有必要使用它.

boost用户组上的这个线程提供了更多信息 - 但我不明白其意义.

从我所看到的,它似乎asio_handler_invoke总是被称为asio_handler_invoke(h, &h),似乎没有多大意义.在什么情况下,参数不是(基本上)相同对象的副本?

最后一点 - 我只是io_service::run()从一个线程调用,所以可能是我遗漏了一些来自多线程循环经验的明显东西.

c++ boost-asio

13
推荐指数
1
解决办法
2075
查看次数

strands如何保证在boost.asio中正确执行挂起事件

考虑使用Boost.asio实现的echo服务器.从连接的客户端读取事件会导致数据块被放置到到达事件队列中.线程池通过这些事件工作 - 对于每个事件,线程获取事件中的数据并将其回送到连接的客户端.

在此输入图像描述

如上图所示,事件队列中可能存在多个来自单个客户端的事件.为了确保按顺序执行和交付给定客户端的这些事件,使用了股数.在这种情况下,来自给定连接客户端的所有事件都在客户端的链中执行.

我的问题是:股如何保证事件处理的正确顺序?我认为必须存在某种锁定链,但即使这样也是不够的,所以必须有更多,我希望有人可以解释一下我们指向一些代码来做到这一点?

我找到了这个文档: 如何工作以及为什么要使用它们

它揭示了这种机制的一些亮点,但是在一条链中说"处理程序执行顺序无法保证".这是否意味着我们最终会收到"永远的草莓."字段?

此外 - 每当新客户端连接时,我们是否必须创建一个新的链,以便每个客户端有一个链?

最后 - 当读取事件到来时,我们如何知道将其添加到哪个链?使用连接作为关键,必须从所有股线中查找钢绞线?

c++ multithreading boost-asio

6
推荐指数
2
解决办法
1239
查看次数

标签 统计

boost-asio ×3

c++ ×3

boost ×1

multithreading ×1