我正在使用的PC上有多个网卡。我想为每个网卡使用一个线程以获得更好的性能。我的应用程序将从多个源中接收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
-------------------------------------------------------

最佳答案

与其在每对网卡的线程中使用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

10-07 16:06