2017-05-29 24 views
1

我有我的工作在PC上的多個網卡。我想每個網卡使用一個線程來獲得更好的性能。我的應用程序將接收來自多個來源的UDP流量,我想通過這些網卡/線程進行分組。多個提升io_service在單獨的線程上的多個網卡

考慮到這樣的體系結構,如果使用boost::asio確實有多個boost::asio::io_service對象,每個對象都運行在分配給單個網卡的單獨線程中?

基本上,一個單一的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 example。有一些代碼支持asio UDP套接字和strandshere

+0

經過一段時間的研究,我認爲這是一個很好的建議。我對ASIO的工作原理有錯誤的理解;一旦我閱讀材料,我開始非常欣賞它。 –