std :: async - 依赖于实现的用法?

ron*_*nag 12 c++ c++11 stdasync

我一直在考虑std::async以及如何在将来的编译器实现中使用它.但是,现在我有点陷入一种感觉像是设计缺陷的东西.

std::async几乎与实现有关,可能有两种变体launch::async,一种是将任务启动到新线程,另一种是使用线程池/任务调度程序.

但是,根据用于实现的这些变体中的哪一个std::async,使用情况会有很大差异.

对于基于"线程池"的变体,您可以启动许多小任务而不必担心开销,但是,如果其中一个任务在某些时候阻塞了怎么办?

另一方面,"启动新线程"变体不会遇到阻塞任务的问题,另一方面,启动和执行任务的开销将非常高.

线程池: +低开销,永不阻塞

启动新线程: +精细的块,高开销

所以基本上取决于实现,我们使用的方式std::async会非常谨慎.如果我们有一个适用于一个编译器的程序,它可能在另一个编译器上工作可怕.

这是设计的吗?或者我错过了什么?你会像我一样考虑这个问题吗?

在当前的规范中,我遗漏了类似的东西std::oversubscribe(bool),以便实现依赖的使用std::async.

编辑:据我所知,C++ 11标准文档没有提供有关发送的任务是否std::async阻止的任何提示.

Ant*_*ams 11

std::async使用std::launch::async"在新线程中运行" 策略启动的任务,因此不支持线程池 - 运行时必须拆除并重新创建每个任务执行之间的所有线程局部变量,这不是直截了当.

这也意味着您可以期望以策略启动的任务std::launch::async同时运行.可能存在启动延迟,如果你有比运行处理器更多的运行线程,那么就会有任务切换,但它们应该正在运行,而不是因为一个人正在等待另一个而死锁.

实现可以选择提供允许您的任务在线程池中运行的扩展,在这种情况下,由该实现来记录语义.