仅仅从std::async
的简单论据来看,似乎没有办法控制内部std::promise
的分配,因此它可以只使用任何东西,尽管可能是std::allocator
。虽然我在理论上猜想它没有指定,但共享状态很可能是在调用线程内分配的。我没有在标准中找到有关此事的明确信息。最后std::async
是一个非常容易异步调用的专用工具,因此您不必考虑是否存在任何地方实际上是 a std::promise
。
为了更直接地控制异步调用的行为,还有std::packaged_task
,它确实有一个分配器参数。但是从纯粹的标准报价来看,这个分配器是否仅仅用于为函数分配存储空间并不十分清楚(因为std::packaged_task
是一种特殊的std::function
),或者它也用于分配内部的共享状态std::promise
似乎有可能:
30.6.9.1 [futures.task.members]:
影响:构造了一个新的packaged_task
对象与共享状态和 初始化对象与std::forward<F>(f)
存储任务。采用Allocator
参数的 构造函数使用它来分配存储内部数据结构所需的内存 。
好了,它甚至不说有是一个std::promise
下(同样为std::async
),它可能只是一个未定义的类型连接到std::future
。
因此,如果确实没有指定如何分配其内部共享状态,最好的办法可能是实现自己的设施进行异步函数调用。考虑到,简单地说,std::packaged_task
只是一个std::function
与std::promise
和std::async
捆绑在一个新的线程(当然,除非没有),只是开始std::packaged_task
,这应该不是太多的问题。
但实际上这可能是规范中的疏忽。虽然分配控制并不适合std::async
,但std::packaged_task
的解释及其对分配器的使用可能会更清楚一些。但这也可能是故意的,所以std::packaged_task
可以随意使用,甚至不需要在内部使用std::promise
。
编辑:重读它,我觉得上面的标准报价确实说,该std::packaged_task
的共享状态使用提供的分配程序分配,因为它是‘内部数据结构’的一部分,不管这些是什么(虽然不需要是实际的std::promise
)。所以我认为std::packaged_task
应该足够显式控制异步任务的共享状态std::future
。
它在哪里保证调用线程分配存储?好的,这很可能,但我仍然希望看到标准的报价。 –
更新的答案更详细。 –
确实,这似乎很清楚,我忽略了这一点。但是,像你现在这样在你的回答中指出这一点不能造成任何伤害。感谢和+1。 –