2015-04-14 171 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