2017-05-29 1 views
1

私は現在作業中のPCに複数のネットワークカードを用意しています。より良いパフォーマンスを達成するために、各ネットワークカードごとにスレッドを使用したいと思います。私のアプリケーションは、これらのネットワークカード/スレッド間でグループ化したい複数のソースからUDPトラフィックを受信します。マルチプルブーストio_service別のスレッド上にある複数のネットワークカード

このようなアーキテクチャを念頭に置いて、boost::asioを複数のboost::asio::io_serviceオブジェクトを使用すると意味がありますが、それぞれ個別のスレッドで1つのネットワークカードに割り当てられていますか?

実質的に単一のboost::asio::io_serviceが、同じネットワークカード上のすべての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

代わりにネットワークカードのペアごとのスレッドでio_serviceを使用しての、あなたがasio::io_service::strandであなたのソケットをラップし、スレッドプール内の単一io_serviceを使用したほうが良いかもしれ、以下を参照してください。Strands: Use Threads Without Explicit LockingAsynchronous IO with boost asioを。

これは、この例のように、クラスで一緒にsocketsstrandsを置くのが最も簡単です:Timer 5 exampleasio UDPソケットとstrandshereをサポートするいくつかのコードがあります。

+0

トピックを勉強するのにしばらく時間を費やした後、私はそれが良い提案だと思う。私はASIOの仕組みを間違って理解していました。私がその資料を読んだ後は、とても感謝し始めました。 –

関連する問題