2

あなたはこのような非同期APIを持つことができます

std::future<int> GetAsync()

たとえば、すでに結果がキャッシュされていて、結果で初期化されたfutureを返したい場合があります。追加のstd::promiseを作成したり、追加の非同期を作成したりすることなく(起動ポリシーを延期して)、現在の標準(または提案)でそれを達成する方法はありますか?

編集

GetAsync()関数にローカルな状態に基づいて結果が計算される場合と、起動ポリシーを延期してstd :: asyncを使用することを選択した場合に備えて、おそらく値によってそれをキャプチャする必要がある場合も考慮してください。

4

2 に答える 2

10

私は明らかに何かを誤解しています、なぜあなたはこれを行うことができないのですか:

std::future<int> GetAsync()
{
  if (/*already got result*/)
  {
    std::promise<int> p;
    p.set_value(/*result*/);
    return p.get_future();
  }  
  return std::async(/*whatever is needed*/);
}

約束を作成することの何が問題になっていますか? future (非同期戻りオブジェクト) から結果を取得する場合は、非同期プロバイダーが必要です。apromiseはそのような型です。

于 2013-01-20T11:49:34.113 に答える
0

フューチャとプロミスの特徴は、マルチスレッドで使用できるように設計されていることです。したがって、将来のオブジェクトを返したい場合は、std::async呼び出し、std::packaged_task<>またはのいずれかを介して作成する必要がありますstd::promise<>。その場合、@ronagの答えはヒットです。

これが一般的なケースではなく、値に間接参照を返したいだけの場合はstd::function、直接計算に を使用するか、その周りのキャッシュ メカニズムExpected<T>を使用するか、futureのようにエラーを処理するための値を使用できます。そのため、スレッドの通信コストはかかりません。

于 2013-01-20T11:55:21.153 に答える