使用 boost asio 进行多线程 http 处理是否需要线程?

2024-01-12

在Boost asio中股线文档 https://www.boost.org/doc/libs/1_78_0/doc/html/boost_asio/overview/core/strands.html它说:

链可以是隐式的也可以是显式的,如以下替代方法所示:

  • ...
  • 如果存在与连接关联的单个异步操作链(例如,在像 HTTP 这样的半双工协议实现中),则处理程序不可能并发执行。这是一条隐含的链。
  • ...

然而,在助推兽的多线程异步 http 服务器的示例 https://github.com/boostorg/beast/blob/master/example/http/server/async/http_server_async.cpp the boost::asio::ip::tcp::acceptor以及每个boost::asio::ip::tcp::socket得到自己的股明确地(见行373 https://github.com/boostorg/beast/blob/master/example/http/server/async/http_server_async.cpp#L373 and 425 https://github.com/boostorg/beast/blob/master/example/http/server/async/http_server_async.cpp#L425)。据我所知,这应该是没有必要的,因为所有这些对象只会在顺序注册/运行中被访问CompletionHandlers. 准确地说,这些对象之一的新异步操作仅在一个对象的末尾注册。CompletionHandler注册在同一个对象上,使得任何对象都可以在单链异步操作

因此,我假设 - 尽管有多个线程同时运行 - 在此示例和示例中可以一起省略链io_context可用于直接调度任何异步操作。那是对的吗?如果不是,我缺少哪些同步问题?我是否误解了上述文档中的陈述?


1:当然,两个套接字或一个套接字和接受器可以同时使用,但由于使用multiple stand示例中也没有阻止这种情况。

²:不可否认,CompletionHandler在当前结束时注册CompletionHandler可能在另一个线程上启动before当前处理程序实际上完成了,i。 e.returns。但我认为这不会带来同步问题的情况。如果我错了,请纠正我。


如果异步操作链创建逻辑链,那么通常您不需要显式链。

此外,如果执行上下文仅从单个线程运行/轮询,则所有异步操作都将在该隐式链上有效。

这些示例有多个目的。

  • 一方面。它们显然保持简单。当然,会有最少数量的线程或简单的操作链。

  • 然而,这会导致例子过于简单化,与现实生活联系太少。

  • 因此,即使不是绝对地根据需要,样本通常表现出良好的实践或先进的模式。有时(通常是输入法)甚至会明确注释这一点。例如。在你非常链接的例子中L277 https://github.com/boostorg/beast/blob/master/example/http/server/async/http_server_async.cpp#L277:

     // We need to be executing within a strand to perform async operations
     // on the I/O objects in this session. Although not strictly necessary
     // for single-threaded contexts, this example code is written to be
     // thread-safe by default.
     net::dispatch(stream_.get_executor(),
                   beast::bind_front_handler(
                       &session::do_read,
                       shared_from_this()));
    

励志例子

这使得人们能够解决下一个重要的任务。例如,假设您想添加stop() to the listener链接示例中的类。如果没有一根线,就没有办法安全地做到这一点。您需要“注入”一个电话acceptor.cancel() inside逻辑“链”,异步操作链包含async_accept。但你不能,因为async_accept是“逻辑上阻塞”该链。所以你实际上确实需要发布到一个显式的链:

void stop() {
  post(acceptor_.get_executor(), [this] { acceptor_.cancel(); });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 boost asio 进行多线程 http 处理是否需要线程? 的相关文章

  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 如何在IE10 Mobile中制作固定div?

    如何制作适用于 Windows Phone 8 上 IE10 Mobile 的固定 div 我当前使用的代码是 div style width 100 background color blue test div 这仅部分有效 当用户滚动时
  • 使用 numpy 在重复信号的一部分内绘制抛物线

    我有一个重复信号 它随着大约每秒重复一次的过程的每个周期而略有变化 尽管每个周期的持续时间和内容在某些参数内略有不同 我的信号数据每秒有一千个 x y 坐标 每个周期内的一小部分但很重要的数据已损坏 我想用向上的抛物线替换每个损坏的部分 对
  • 安卓屏幕方向

    I tried getOrientation 获取方向值但它总是返回0 getOrientation 已弃用 但这不一定是问题的根源 确实 您应该使用获取旋转 代替获取方向 但只有当您的目标是 Android 2 2 API 级别 8 或更
  • 无法将关键字“用户名”解析为字段。选项有:城市、身份证、电话等

    我想就这些问题寻求帮助 我确实知道这似乎与同一问题的其他问题相似 但我环顾四周 发现没有什么可以真正解决我的问题 顺便说一句 这是我第二次在这里提问 所以请告诉我这条消息是否太长 谢谢 我将 AllAuth 与 Django 1 8 和 P
  • 如何为postgresql中的所有表创建触发器?

    我有一个触发器 但我需要与我的 postgres 的所有表关联 有下面这样的命令吗 CREATE TRIGGER delete data alldb BEFORE DELETE ON ALL DATABASE FOR EACH ROW EX
  • 将 UILabel 文本设置为粗体[重复]

    这个问题在这里已经有答案了 如何设置文本UILabel以编程方式在 Swift 中加粗 到目前为止我的代码 var label UILabel frame theFrame label text Foo Use font的财产UILabel
  • 带有徽标图像的 django pdf

    我使用比萨创建了发票 Pdf 文本模板 但我想在 pdf 文件中显示徽标 图像 以及文本 我不知道如何在 pdf 中显示图像 我的看法如下 def generate invoice request user id None personal
  • 在 .NET Core 中将 HTML 转换为图像

    我想在 Web 服务器上将 HTML 代码转换为图像 png jpg 然后在我的 NET Core 应用程序中通过电子邮件发送图像链接 我不想购买任何第三方库 如 NReco 或 EVo 还有其他方法可以在 dotnet core 2 0
  • 有没有一种方法可以仅使用 javascript 命令来选择图像并将其复制到剪贴板?

    我想复制图像本身而不是任何文本或相关的 src 我做了一个 jsfiddle 的例子https jsfiddle net pvuefca7 1 https jsfiddle net pvuefca7 1 您可以尝试一下 发现复制文本效果很好
  • 如何在 Formik 上实现自定义 handleChange 函数?

    在输入元素中 handleChange 函数将从 onChange 事件接收事件对象 如何为如下非输入字段创建自定义 handleChange 函数 import React from react import useFormik from
  • 如何使用 XCTest 从 iOS 13 删除/重置应用程序?

    最近我开始使用 XCTest 测试 iOS 应用程序 但我发现了一些困难 主要困难是删除或重置每个测试类中的应用程序内容 我目前正在使用 XCode 11 并尝试从 iOS 13 中为每个测试类删除 重置应用程序 我已经尝试过 通过跳板删除
  • 在 adMob 中仅显示文字广告

    我已将我的 adMob 帐户更新到新版本 我只想在我的应用中显示文字广告 我如何使用新版本的 adMob 帐户做到这一点 或者 如何在新版本的 adMob 帐户中屏蔽图片广告 这可以在您的 AdMob 帐户上完成 去 AdMob gt 获利
  • 检查是否在 mySQL 的多个列之一中找到字符串

    我需要检查是否在一列或多列中找到字符串 基本上 我有一个程序可以让你检查多个字段 姓名 姓氏等 如果同时检查姓名并且用户仅输入姓名 例如 chris 则可以很容易地在 mySQL 中使用 LIKE 参数进行检查 如下所示 select fr
  • 统一访问Web服务

    我有三个 Web 服务 它们是由三个不同的供应商开发的 并且具有不同的 URL 输入参数和输出参数 它们都是 ASMX Web 服务 它们用于从第三方关系数据库中删除记录 例如我提供一个 personID 然后一个人就会从一个系统中删除 并
  • SharePoint 错误:找不到 xxxx 的 Web 应用程序

    当我尝试执行这段代码时 SPSite siteCollection new SPSite http sp devxxx 10000 它抛出以下错误 Web 应用程序位于http sp devxxx 10000 http sp devxxx
  • 从不正确的 .Rbuildignore 文件构建后,包中的整理字段中的文件丢失

    我的包的其中一个函数在构建时拒绝添加到包源中 然后在运行 R CMD 检查时失败 我的包位于github上here https github com eshilts dc crime data 文件calculate latitude an
  • 迭代 C 数组

    我有一个在程序中某处创建的结构数组 后来 我想迭代它 但我没有数组的大小 如何迭代元素 或者我需要将尺寸存储在某处吗 如果在编译时已知数组的大小 则可以使用结构大小来确定元素的数量 struct foo fooarr 10 for i 0
  • 如何解决 Arango 查询承诺错误? [复制]

    这个问题已经存在了 我一直在尝试使用肥皂消息从 Arangodb 获取查询结果到我的前端服务 Angular 4 我能够获得查询结果 但在 console log 中打印出来 但是我如何在这个功能 Service 下获取它 这样我就可以输入
  • 如何在 React Native 中创建聊天气泡的卷曲箭头/尾部

    我目前正在用反应本机制作聊天气泡 由于我是反应原生的新手 我首先尝试在浏览器上制作聊天气泡 然后尝试在反应原生中复制相同的内容 我正在努力复制反应本机中的箭头 有什么想法 建议吗 普通 HTML CSS div p class to me
  • 使用 boost asio 进行多线程 http 处理是否需要线程?

    在Boost asio中股线文档 https www boost org doc libs 1 78 0 doc html boost asio overview core strands html它说 链可以是隐式的也可以是显式的 如以下