の単なる引数から判断する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 [先物.タスク.メンバー]:
効果:共有状態で新しいオブジェクトを構築しpackaged_task
、オブジェクトのストアド タスクを で初期化しますstd::forward<F>(f)
。引数を取るコンストラクターは、Allocator
それを使用して、内部データ構造を格納するために必要なメモリを割り当てます。
まあ、それは下にあるとさえ言っていませんstd::promise
(同様にstd::async
)、それは単に a に接続可能な未定義の型である可能性がありstd::future
ます。
したがって、 が内部共有状態をどのように割り当てるかが実際に指定されていない場合std::packaged_task
、最善の策は、非同期関数呼び出し用の独自の機能を実装することです。std::packaged_task
簡単に言えば、aは単に a にstd::function
バンドルされておりstd::promise
、新しいスレッドで a を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