【问题标题】:multiple boost io_service for multiple network cards on separate threads多个提升 io_service 用于不同线程上的多个网卡
【发布时间】:2017-10-30 04:24:50
【问题描述】:

我正在使用的电脑上有多个可用的网卡。我想为每个网卡使用一个线程来获得更好的性能。我的应用程序将接收来自多个来源的 UDP 流量,我想跨这些网卡/线程进行分组。

考虑到这样的架构,如果使用 boost::asio 有多个 boost::asio::io_service 对象是否有意义,每个对象在分配给单个网卡的单独线程上运行?

基本上单个boost::asio::io_service 将在一个thead 中运行,以执行绑定在同一网卡上的所有UDP 套接字的所有异步方法。

独立处理每张卡上接收到的网络流量是个好主意吗?

NIC A  --->    boost::io_service nic_a;

               socket one(nic_a);
               one.bind(nic_a, 0);

               socket two(nic_a);
               two.bind(nic_a);

               // all sockets call async_read

-------------------------------------------------------
               nic_a.run(); /// call this in Thread #a
-------------------------------------------------------

NIC B  --->    boost::io_service nic_b;

               socket three(nic_b);
               three.bind(nic_b, 0);

               socket four(nic_b);
               four.bind(nic_b);

               // all sockets call async_read

-------------------------------------------------------
               nic_b.run(); /// call this in Thread #b
-------------------------------------------------------

【问题讨论】:

    标签: c++ multithreading networking boost-asio


    【解决方案1】:

    与其在每对网卡的线程中使用io_service,不如将​​套接字包装在asio::io_service::strand 中并在线程池中使用单个io_service,请参阅:Strands: Use Threads Without Explicit LockingAsynchronous IO with boost asio.

    最简单的方法是将socketsstrands 放在一个类中,如下例所示:Timer 5 example。有一些代码支持asio UDP 套接字和strands here

    【讨论】:

    • 在花了一些时间研究这个主题之后,我认为这是一个很好的建议。我对 ASIO 的工作原理有错误的理解;一旦我阅读了这些材料,我就开始非常欣赏它。
    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多