我一直在思考std::async
以及应该如何在未来的编译器实现中使用它。然而,现在我有点被一些感觉像是设计缺陷的东西困住了。
这std::async
几乎取决于实现,可能有两种变体launch::async
,一种将任务启动到新线程中,另一种使用线程池/任务调度程序。
但是,根据用于实现的这些变体中的哪一个,std::async
用法会有很大差异。
对于基于“线程池”的变体,您将能够启动许多小任务而不必担心开销,但是,如果其中一个任务在某个时候阻塞怎么办?
另一方面,“启动新线程”变体不会遇到阻塞任务的问题,另一方面,启动和执行任务的开销会非常高。
线程池: +低开销,-从不阻塞
启动新线程: +fine with blocks,-high开销
所以基本上取决于实现,我们使用的方式std::async
会非常谨慎。如果我们有一个程序可以很好地与一个编译器一起工作,那么它可能会在另一个编译器上运行得非常糟糕。
这是设计使然吗?还是我错过了什么?你会像我一样认为这是一个大问题吗?
在当前规范中,我缺少类似的东西std::oversubscribe(bool)
,以便实现独立于std::async
.
编辑:据我所知,C++11 标准文档没有给出关于发送到的任务是否std::async
阻塞的任何提示。