仅从论点来看std::async
,似乎没有办法控制内部的分配,std::promise
因此它可以使用任何东西,尽管可能是std::allocator
. 虽然我猜理论上它是未指定的,但共享状态很可能是在调用线程内分配的。我没有在标准中找到任何关于这个问题的明确信息。最后std::async
是一个非常专业的工具,可以轻松进行异步调用,因此您不必考虑是否真的有任何std::promise
地方。
为了更直接地控制异步调用的行为,还有std::packaged_task
,它确实有一个分配器参数。但是从纯粹的标准引用来看,这个分配器是否只是用于为函数分配存储空间(因为std::packaged_task
它是一种特殊的std::function
)或者它是否也用于分配 internal 的共享状态std::promise
,虽然看起来很可能:
30.6.9.1 [futures.task.members]:
效果:构造一个packaged_task
具有共享状态的新对象,并用 初始化该对象的存储任务std::forward<F>(f)
。接受Allocator
参数的构造函数使用它来分配存储内部数据结构所需的内存。
好吧,它甚至没有说下面有a(std::promise
同样 for std::async
),它可能只是一个可连接到 a 的未定义类型std::future
。
因此,如果确实没有指定如何std::packaged_task
分配其内部共享状态,那么最好的选择可能是实现自己的异步函数调用设施。考虑到,简单地说,astd::packaged_task
只是与 astd::function
捆绑在一起,std::promise
并且std::async
只是在一个新线程中启动 a std::packaged_task
(好吧,除非它没有),这应该不是太大的问题。
但实际上这可能是规范中的疏忽。虽然分配控制并不真正适合std::async
,但分配器的解释std::packaged_task
及其使用可能会更清楚一些。但这也可能是有意的,因此std::packaged_task
可以随意使用它想要的任何东西,甚至不需要std::promise
内部。
编辑:再读一遍,我认为上面的标准引用确实说,std::packaged_task
的共享状态是使用提供的分配器分配的,因为它是“内部数据结构”的一部分,无论是什么(不需要是一个实际的std::promise
,虽然)。所以我认为std::packaged_task
应该足以显式控制异步任务的共享状态std::future
。