使用多个 io_service 对象

2024-06-20

我有我的应用程序,其中侦听和处理来自互联网套接字和 unix 域套接字的消息。现在我需要将 SSL 添加到互联网套接字,我使用的是单个io_service应用程序中所有套接字的对象。看来现在我需要添加单独的io_service网络套接字和 unix 域套接字的对象。我的应用程序中没有任何线程,我使用async_send and async_recieve and async_accept处理数据和连接。请指出任何使用多个的示例io_service具有异步处理程序的对象。


这个问题有一定程度的不确定性,就好像有多个io_service需要对象。我无法在其中找到任何内容参考 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference.html文档或概述SSL http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/overview/ssl.html and UNIX 域套接字 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/overview/posix/local.html规定单独的io_service对象。无论如何,这里有一些选择:


Single io_service:

尝试使用单个io_service.

如果您没有直接处理io_service对象,但你有一个 Boost.Asio I/O 对象的句柄,例如一个套接字,然后是一个关联的句柄io_service可以通过调用获取对象socket.get_io_service() http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_stream_socket/get_io_service.html.


每使用一个线程io_service:

如果有多个io_service需要对象,然后为每个对象指定一个线程io_service。这种方法被用在Boost.Asio的HTTP服务器2 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/http/server2/例子。

boost::asio::io_service service1;
boost::asio::io_service service2;

boost::thread_group threads;
threads.create_thread(boost::bind(&boost::asio::io_service::run, &service1));
service2.run();
threads.join_all();

这种方法的一个后果是它可能需要应用程序做出线程安全保证。例如,如果service1 and service2两者都有调用的完成处理程序message_processor.process(), then message_processor.process()需要是线程安全的或以线程安全的方式调用。


Poll io_service:

io_service http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service.html提供非阻塞替代方案run()。然而io_service::run() http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service/run/overload1.html将阻塞直到所有工作完成,io_service::poll() http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service/poll/overload1.html将运行准备运行且不会阻塞的处理程序。这允许单个线程在多个线程上执行事件循环io_service对象:

while (!service1.stopped() &&
       !service2.stopped())
{
  std::size_t ran = 0;
  ran += service1.poll();
  ran += service2.poll();
  // If no handlers ran, then sleep.
  if (0 == ran)
  {
    boost::this_thread::sleep_for(boost::chrono::seconds(1));
  }
}

为了防止在没有准备运行的处理程序时出现紧忙循环,可能值得添加睡眠。请注意,此睡眠可能会在事件的整体处理中引入延迟。


将处理程序转移到单个io_service:

一种有趣的方法是使用strand http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service__strand.html将完成处理程序传输到单个io_service。这允许每个线程io_service,同时避免应用程序做出线程安全保证,因为所有完成处理程序都将通过单个服务发布,该服务的事件循环仅由单个线程处理。

boost::asio::io_service service1;
boost::asio::io_service service2;

// strand2 will be used by service2 to post handlers to service1.
boost::asio::strand strand2(service1);
boost::asio::io_service::work work2(service2);

socket.async_read_some(buffer, strand2.wrap(read_some_handler));

boost::thread_group threads;
threads.create_thread(boost::bind(&boost::asio::io_service::run, &service1));
service2.run();
threads.join_all();

这种方法确实会产生一些后果:

  • 它需要由主程序运行的处理程序io_service被包裹通过strand::wrap() http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service__strand/wrap.html.
  • 异步链现在贯穿两个io_services,增加了复杂性。重要的是要考虑到次要的情况io_service不再有工作,导致其run()回来。

异步链出现在同一个链中是很常见的。io_service。因此,服务永远不会停止工作,因为完成处理程序会将额外的工作发布到io_service.

   |    .------------------------------------------.
   V    V                                          |
read_some_handler()                                |
{                                                  |
  socket.async_read_some(..., read_some_handler) --'
}

另一方面,当使用一条线将工作转移到另一条线时io_service,包装的处理程序被调用service2,使其将完成处理程序发布到service1。如果包装处理程序是唯一的工作service2, then service2不再有工作,导致servce2.run()回来。

    service1                      service2
====================================================

        .----------------- wrapped(read_some_handler)
        |                            .
        V                            .
 read_some_handler                NO WORK
        |                            .
        |                            .
        '----------------> wrapped(read_some_handler)

为了解决这个问题,示例代码使用了io_service::work http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service__work.html for service2以便run()在明确告知之前一直处于封锁状态stop() http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/io_service/stop.html.

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

使用多个 io_service 对象 的相关文章

  • Boost Beast 在关闭后重新连接 websocket 连接

    我正在使用 boost beast 创建 websocket 连接 到目前为止它似乎工作正常 但我无法弄清楚断开连接后是否应该替换 websocket stream 变量 即我有一个变量 boost beast websocket stre
  • Linux 上的 Boost Asio 不使用 Epoll

    我的印象是 boost asio 默认情况下会使用 epoll 设置而不是 select 实现 但在运行一些测试后 看起来我的设置正在使用 select 操作系统 RHEL 4内核 2 6海湾合作委员会 3 4 6 我编写了一个小测试程序来
  • 使用Boost.Asio获取“整个数据包”

    我有一个 TCP 客户端连接到我的服务器 它正在发送原始数据包 如何使用 Boost Asio 每次都能获取 整个 数据包 当然是异步的 假设这些数据包可以是任意大小 最多可达我的内存的完整大小 基本上 我想避免创建静态大小的缓冲区 通常
  • 如何在 Android NDK 中使用 Asio(独立于 Boost)?

    Asio 没有 Boost 应该只使用标题就可以使用 对吗 默认情况下 Asio 是一个仅包含头文件的库 http think async com http think async com 我知道Asio内部仍然依赖Boost 这是我的设置
  • 使用 Poco 和 Boost C++ 的多个 Http 服务器

    我正在尝试使用 Poco Net 和 Boost 库创建多个 Http 服务器 但在 Poco 文件内部出现以下错误应用程序 cpp Assertion violation pInstance 0 in file src Applicati
  • 是否有用于阻塞 boost::asio TCP 连接的 boost::iostreams (双向)设备?

    我正在调查可移植的 C 库 阻止对文件系统和网络的 I O 访问 它looks like boost filesystem boost iostreams and boost asio将由他们三人共同完成这项工作 需要明确的是 我目前对异步
  • 使用 BOOST 进程在单独的线程中读取子进程标准输出

    我有一个主程序 它使用 boost 进程库来生成一个打印的子进程 Hello World 每 5 秒在其标准输出上一次 我想在主进程中的子进程的标准输出可用时读取 监视它 并在主程序中执行其他操作 我已经尝试过这些例子boost async
  • Boost.Asio安装问题

    我已经使用 bjam install 安装了 boost 库 但是当我编译程序时 include boost asio hpp int main return 0 出现此类错误 tmp ccVR3eeF o In function stat
  • Boost asio架构文档

    有谁知道 boost asio 的良好架构文档吗 我在 boost documentation 中找到的只是有关 api 以及如何使用它们的内容 我想更深入地了解它们背 后的概念 如果我忽略了 boost 文档 请让我知道正确的资源 以下是
  • 将升压套接字存储在向量中[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 这是代码 我收到以下错误 In member function void socks4Server listener i
  • boost read_until 不会在分隔符处停止

    我使用 boost read until 函数来促进通过套接字接收和解析 HTTP 消息 所以我是什么trying要做的就是从套接字中 read until 直到 r n 我认为应该给我一行 HTTP 标头 每个 HTTP 标头行以 r n
  • 使用 boost asio 枚举我的卡的 ipv4 和 ipv6 地址

    我正在尝试枚举我的电脑的所有网卡 我有 2 张卡 的 ipv4 和 ipv6 地址 我正在使用以下代码来执行此操作 using boost asio ip tcp boost asio io service io service tcp r
  • 如何取消 boost asio io_service 帖子

    如何取消已发布的回调 getIoService gt post boost bind MyClass myCallback this 并保持其他发布的回调不变 问题是我有一些对象从不同线程接收事件 并将它们发布到 ioservice 以便处
  • 使用 Boost.Asio 进行广播的问题

    如果问题之前已得到解答 我提前表示歉意 但我已经搜索并没有找到任何对我有帮助的东西 正如问题标题所示 我正在尝试将包从服务器广播到一组侦听任何消息的客户端 客户端将计算一秒钟内收到的消息数 服务器端的事情是这样的 class Server
  • 提高批量请求的野兽内存使用率

    我运行这个boost beast 客户端 异步 ssl http www boost org doc libs develop libs beast example http client async ssl http client asy
  • 使用 boost asio 捕获 Ctrl-C

    I m trying to catch the Ctrl C in application as demonstrated in the following MWE include
  • 什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?

    有一个谨慎的小量 boost asio ssl http en wikipedia org wiki Transport Layer Security小型 C 在线教育代码库 甚至更少boost asio ssl context load
  • 提升::亚洲。消息是在哪个线程中发送的?

    我试图了解内部工作boost asio图书馆 这真的很棒 我编写了一个简单的客户端 用于向服务器发送一条消息 问题是 它真正在哪个线程中发送消息 自从我使用async write 方法 调用后立即返回并且不发送任何内容 我已经评论了io s
  • 取消后调用 boost::asio 异步处理程序没有错误

    我的代码在单个线程中使用 boost asio 和 io service 来执行各种套接字操作 所有操作都是异步的 每个处理程序都依赖于boost system error code 特别boost asio error operation
  • 使用多个 io_service 对象

    我有我的应用程序 其中侦听和处理来自互联网套接字和 unix 域套接字的消息 现在我需要将 SSL 添加到互联网套接字 我使用的是单个io service应用程序中所有套接字的对象 看来现在我需要添加单独的io service网络套接字和

随机推荐

  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Windows 上良好的 Oracle 数据库开发和管理工具 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找像 sql server management studio 这样的 Oracle 数据库管理工具 我在互联网上搜索并在以下链接
  • 在 flutter 中强制重建有状态子部件

    假设我有一个主屏幕 有状态小部件 其中有一个变量count作为状态 在此主屏幕中 有一个按钮和另一个有状态小部件 我们称之为MyListWidget MyListWidget初始化它自己的小部件initState取决于的值count多变的
  • Cocoa 应用程序菜单栏不可点击

    我正在我的可可应用程序中构建一个菜单栏 其中包含以下代码 implementation我的自定义应用程序CustomApplication void setUpMenuBar CustomApplication sharedApplicat
  • dapper 可以反序列化存储为文本的 json 吗?

    public class MyType public int Id get set public int MyArray get set var sql SELECT id MyArrayAsJson as MyArray var x aw
  • 可以访问每个套接字的 TCP 统计数据/信息吗? (C/C++)

    我需要一些信息 例如我创建的特定 TCP 套接字发生的重新发送包 数据包丢失的数量 有人知道如何直接从我的 C C 程序访问或请求此类信息吗 也许是 Linux 特有的东西 或者我是否需要 作为解决方法 捕获和分析我自己的流量 提前致谢 通
  • 序列包含多个元素

    我在通过 Linq 获取 RhsTruck 类型的列表并显示它们时遇到一些问题 RhsTruck 只有属性 品牌 型号 序列号 等 RhsCustomer 具有 CustomerName CustomerAddress 等属性 我不断收到错
  • 单元测试:创建“模拟”请求来模拟 MVC 页面请求

    如何为我的 asp net mvc 应用程序创建模拟请求以进行单元测试 我有什么选择 我在我的操作中使用 FormsCollection 因此我也可以模拟表单输入数据 您只需创建 FormCollection 的新实例并在其中添加数据即可
  • JSF1064 jsf 2.0 上的“无法找到或提供资源”警告

    我正在 Weblogic 10 3 3 上使用 Java EE 5 和 JSF 2 0 Mojarra 2 0 3 开发一个企业项目 我没有错误 但在浏览我的应用程序时 控制台中出现了非常烦人的警告 每当我在 JSF 中执行重定向时 我都会
  • ajax推送服务器

    好吧 我最近写了一个ajax推送脚本 其中后端的php在等待某人更新时处于休眠状态 但是休眠的进程占用了大量的cpu 关于如何防止这种情况的任何想法 我猜我必须要么找到一个可以使用线程休眠的程序 要么用我不太熟悉的 python 或 c 编
  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 创建一个在 MPI 进程之间保持同步的计数器

    我在使用基本的通信和组 MPI2 方法方面拥有相当多的经验 并且使用 MPI 做了相当多的令人尴尬的并行模拟工作 到目前为止 我已经将代码构建为具有一个调度节点和一堆工作节点 调度节点有一个将与模拟器一起运行的参数文件列表 它使用参数文件为
  • React Native this.'function' 不是一个函数

    我正在学习 React Native 和 Redux 这里有很多与我类似的问题 但我很难与我的问题联系起来 当我在另一个方法中调用一个方法时 它不断地返回给我 this some function 不是一个函数 我真的不知道该怎么做 这是我
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 限制文本日志文件的好方法

    我有一个 winForm 应用程序 其中有一个用于记录目的的文本文件 我想将其大小限制为 10 MB 这样如果超过此限制并写入新数据 则删除文本文件中最旧的数据以为新数据腾出空间 有什么有用的建议吗 使用一些日志框架 我建议NLog htt
  • 为什么我的 CloudFormation 脚本无法下载文件?

    我需要在 Windows 实例初始化期间下载文件 为了测试这一点 我使用以下脚本来下载 Google 徽标 使用简化版本的Windows 角色和功能模板 https s3 amazonaws com cloudformation templ
  • 如何将行从一个 DataGridView 移动到另一个 DataGridView?

    我有两个具有相同列架构的 DataGridView 尽管两个不同的 DataView 作为数据源 如果这很重要 将行从一个数据网格视图移动到另一个数据网格视图的最佳 最快方法是什么 我相信如果您在 DataTable table1 中有一行
  • 勾选或取消勾选复选框时输入时间戳

    我有一个 3 行 7 列的工作表 A1 G3 A 和 B 列有 6 个复选框 A1 B3 A 列和 B 列中的框分别链接到 C 列和 D 列 E 列和 F 列中的单元格只是分别复制 C 列和 D 列 实时E1细胞是 C1 and F3细胞是
  • 使用多个 io_service 对象

    我有我的应用程序 其中侦听和处理来自互联网套接字和 unix 域套接字的消息 现在我需要将 SSL 添加到互联网套接字 我使用的是单个io service应用程序中所有套接字的对象 看来现在我需要添加单独的io service网络套接字和