0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::threadのjoinとdetach
  2. std::mutex、lock_guard、unique_lock
  3. 条件変数とワーカーパターン
  4. std::asyncとstd::futureの基本
← C++ Academyに戻る