我正在处理的电脑上有多个网卡。我想为每个网卡使用一个线程来实现更好的性能。我的应用程序将从多个源接收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
-------------------------------------------------------
答案 0 :(得分:1)
不是在每对网卡的线程中使用io_service
,最好将套接字包装在asio::io_service::strand
中并在线程池中使用单个io_service
,请参阅:Strands: Use Threads Without Explicit Locking和Asynchronous IO with boost asio。
最简单的方法是将sockets
和strands
放在一个类中,如下例所示:Timer 5 example。有些代码支持asio
UDP套接字和strands
here。