std::asyncとstd::futureの基本
タスクを非同期に実行し、std::futureで結果を取得します。
「std::asyncとstd::futureの基本」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
非同期タスク
std::asyncは関数を非同期に実行し、結果を提供するstd::futureを返します。スレッドを手動で管理するよりも高水準な方法です。
基本的な使い方
呼び出し可能オブジェクトと引数を渡します。std::asyncはstd::future<Result>を返します。
#include <future>
int compute() { return 42; }
std::future<int> f = std::async(compute);
int result = f.get(); // blocks until done起動ポリシー
最初の引数で、タスクを実行するタイミングを制御します。
std::launch::async— 新しいスレッドを直ちに開始しますstd::launch::deferred— get()の呼び出し時に同期的に実行します- デフォルト(ポリシーを指定しない場合)— 実装が選択します
auto f = std::async(std::launch::async, compute);std::futureのメソッド
主な操作は次のとおりです。
get()— 完了するまでブロックし、結果を返します(1回 בלבד)wait()— ブロックしますが、結果は返しませんwait_for(d)/wait_until(t)— 時間制限付きで待機しますvalid()— このfutureがセットアップ済みかどうかを確認します
例外の伝播
非同期タスクが例外をスローすると、その例外はfutureに保存され、get()の呼び出し時に再スローされます。
auto f = std::async([] { throw std::runtime_error("oops"); });
try {
f.get();
} catch (const std::exception& e) {
std::cout << e.what();
}複数の値を返す
結果をtuple、struct、またはコンテナでラップします。
auto f = std::async([] {
return std::make_pair(42, std::string("hello"));
});
auto [n, s] = f.get();複数のタスクを並列実行する
複数の非同期タスクを起動し、すべてのタスクの完了を待機します。
auto a = std::async(work_a);
auto b = std::async(work_b);
auto c = std::async(work_c);
std::cout << a.get() + b.get() + c.get();std::promise: 手動でfutureを作成する
コンシューマーがfutureを必要とし、プロデューサーが別のスレッドで実行されるプロデューサー・コンシューマーパターンでは、std::promiseを使用します。
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t([&p] { p.set_value(42); });
std::cout << f.get();
t.join();std::packaged_task
呼び出し可能オブジェクトとfutureを1つにまとめます。別の場所(スレッドプールなど)でタスクを呼び出す場合に便利です。
shared_future
std::futureは1回しか読み取れません。std::shared_futureを使うと複数の読み取り側が利用できるため、結果のブロードキャストに便利です。
デストラクタの動作
デフォルトポリシーでstd::asyncから返されたfutureのデストラクタは、タスクが完了するまでブロックすることがあります。長時間実行されるタスクでは注意してください。
std::asyncの先へ
本番向けの非同期処理には、Boost.AsioやFolly、またはC++20/23のエグゼキューターやコルーチンなどのライブラリを検討してください。std::asyncは出発点として利用できます。
確認問題
std::futureに対して.get()を呼び出すと、何が起こりますか。
まとめ
std::asyncは関数を非同期に実行し、返されたstd::futureが結果を提供するとともに例外を伝播します。起動ポリシーを使って実行方法を制御してください。複雑なパターンにはstd::promiseとstd::packaged_taskを使用します。
よくある質問
「std::asyncとstd::futureの基本」レッスンは無料ですか?
はい。「std::asyncとstd::futureの基本」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「std::asyncとstd::futureの基本」で何を学びますか?
タスクを非同期に実行し、std::futureで結果を取得します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「std::asyncとstd::futureの基本」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- std::threadのjoinとdetach
- std::mutex、lock_guard、unique_lock
- 条件変数とワーカーパターン
- std::asyncとstd::futureの基本