1. ホーム
  2. c++

[解決済み] std::promiseとは何ですか?

2022-03-24 20:59:45

質問

私は、C++11の std::thread , std::asyncstd::future コンポーネントを使用します(例 この回答 というように、簡単なものです。

しかし std::promise は、何をするものなのか、どのような場面で使うのが最適なのか。規格書自体には、クラスの概要以上の情報はなく、また std::スレッド .

だれか、簡単で簡潔な例を教えてください。 std::promise が必要であり、それが最も慣用的な解決策である場合はどうでしょうか?

どのように解決するのですか?

futures.state]の言葉を借りれば std::future 非同期リターンオブジェクト ("共有状態から結果を読み取るオブジェクト")と std::promise 非同期プロバイダ ("an object that provides result to a shared state") すなわち、プロミスは、あなたが セット を実行し、その結果 得る を関連する未来から取得します。

非同期プロバイダは、フューチャーが参照する共有ステートを最初に作成するものです。 std::promise は、非同期プロバイダの一種です。 std::packaged_task は別のもので、その内部詳細については std::async は別のものです。 それぞれが共有状態を作り出し、あなたに std::future その状態を共有し、状態を準備することができます。

std::async は、非同期結果オブジェクトを提供し、内部で非同期プロバイダの作成とタスク完了時の共有状態の準備の面倒を見る、より高レベルの便利なユーティリティです。これをエミュレートするには std::packaged_task (または std::bindstd::promise ) と std::thread を使うのが安全で簡単です。 std::async .

std::promise は少し低レベルで、非同期の結果を future に渡したいときのためのものですが、結果を準備するためのコードは std::async . 例えば、いくつかの promise と関連する future のような、複数の計算を行い、それぞれのプロミスで結果をセットするスレッドを1つ持っています。 async では1つの結果しか返せないので、複数の結果を返したい場合は async を複数回実行し、リソースを浪費する可能性があります。