2015-04-14 211 views
0

我是C++的新手,我嘗試使用std :: async與launch :: async來產生新的線程來處理傳入的UDP數據包。對於特定端口上的每個新請求,異步會產生一個新線程來處理它。異步使用線程池?

在負載下,我發現udp數據包到達了我,但異步產生一個線程並開始處理信息需要超過10秒的時間。我想知道是否有底層線程池,這就是原因,異步被阻止並且正在等待。如果是的話,我該如何增加這個線程池的大小?

+1

10秒是產生一個線程的荒謬時間,你可能在OS資源上遇到某種限制。另外,我建議您查看[boost.ASIO](http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio.html),以獲得一個優秀的庫,用於基於任務的並行性和聯網並且已經提議將其納入標準。 – sjdowling

+0

我在代碼中添加了更多工具,並確定該問題不適用於異步。在輪詢之後,數據包僅在10秒後被挑選出來處理。我仍然不明白爲什麼首先投票的時間會很長。 – sethu

回答

1

根據標準std::async由於對線程本地存儲的要求,不能使用線程池。然而,在實踐中MSVC確實使用線程池,因爲它的實現是建立在PPL的基礎之上的,他們只是忽略線程本地存儲的需求。按照語言的要求,其他實施將啓動對std::async的每次調用的新線程。

就像以前一樣,Bartosz在這方面有很棒的blog post