僅僅從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。 –