我一直在考虑std::async
以及如何在未来的编译器实现中使用它。但是,现在我有点卡住了感觉像设计缺陷的东西。std :: async - 与实现相关的用法?
std::async
几乎与实现有关,可能有两个变种launch::async
,一个将任务启动到新线程中,另一个使用线程池/任务调度程序。
但是,根据用于实施std::async
的这些变体中的哪一个,使用情况会有很大差异。
对于基于“线程池”的变体,您将能够启动大量小型任务,而不用担心很多开销,但是,如果其中一个任务在某个时间点阻塞了,该怎么办?
另一方面,“启动新线程”变体不会遇到阻塞任务的问题,另一方面,启动和执行任务的开销将非常高。
线程池: +低开销,-never曾经阻止
推出新的线程: +罚款块,志高开销
所以基本上取决于实施,我们使用std::async
的方式会非常谨慎。如果我们有一个与一个编译器兼容的程序,它可能会在另一个编译器上运行。
这是设计吗?或者我错过了什么?你会认为这个和我一样是个大问题吗?
在当前的规范中,我缺少类似std::oversubscribe(bool)
的内容,以便实现依赖于std::async
的使用。
编辑:据我已阅读,C++ 11标准文档不会给任何提示关于发送到std::async
的任务是否可能会阻塞。
就像一个加法:http://en.cppreference.com/w/cpp/thread/async提供了一个非常简单而实际的阻止'std :: async'调用的例子。 – KillianDS 2012-02-20 15:50:29
您似乎认为线程池具有固定的大小。实际上,很多都是动态调整大小的,所以阻塞不是问题。 – 2014-01-22 23:24:13
@MooingDuck:TBB和Concrt都没有“动态”大小的线程池。你知道哪些线程池是动态调整大小的?即使你有一个动态调整大小的线程池,你反而会遇到超额订阅的问题,并且需要任何启发式的开销来跟踪何时添加新线程和删除旧线程。 – ronag 2014-01-22 23:31:42