多个提升io_service,用于在不同线程

时间:2017-05-29 19:58:20

标签: c++ multithreading networking boost-asio

我正在处理的电脑上有多个网卡。我想为每个网卡使用一个线程来实现更好的性能。我的应用程序将从多个源接收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
-------------------------------------------------------

1 个答案:

答案 0 :(得分: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