仅从论点来看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。