以前にKotlinで非同期処理について記載しましたが今回はC++で非同期処理について記載したいと思います
-
-
Kotlinで非同期処理を実装する
今回はKotlinでの非同期処理についてになります。非同期処理は【kotlinx-coroutines-core】モジュ ...
関連記事へ
| 名称 | バージョン |
|---|---|
| C++ | 14 |
std::async と std::futureを使用するパターン
- 用途 : 単純な非同期タスクの実行と結果取得
- 利点 : 最もシンプルな記述。スレッド管理が自動。例外もfuture.get()で取得可能
- 適した場面 : ファイル読み込み、API呼び出し、計算処理の非同期化
// 非同期でタスクを実行
auto future = std::async(std::launch::async, []() {
std::cout << " [Async] 処理開始 (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// 時間のかかる処理をシミュレート
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << " [Async] 処理完了" << std::endl;
return 42;
});
std::cout << " [Main] 他の処理を実行中... (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// 結果を取得(完了まで待機)
int result = future.get();
std::cout << " [Main] 結果: " << result << std::endl;
std::threadを使用するパターン
- 用途 : スレッドの細かい制御が必要な場合
- 利点 : 低レベルな制御が可能。detach()でバックグラウンド実行可能。スレッドの生存期間を明示的に管理
- 適した場面 : ログ出力、監視処理、長時間のバックグラウンドタスク
// スレッドを作成して実行
std::thread t([]() {
std::cout << " [Thread] 別スレッドで実行 (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// 時間のかかる処理をシミュレート
std::this_thread::sleep_for(std::chrono::milliseconds(300));
std::cout << " [Thread] 処理完了" << std::endl;
});
std::cout << " [Main] メインスレッド (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// スレッドの完了を待つ
t.join();
// または t.detach() でデタッチ(スレッドをバックグラウンドで実行)
std::promise と std::futureを使用するパターン
- 用途 : スレッド間で値や例外を明示的に渡す
- 利点 : 任意のタイミングで値をセット可能。1つのスレッドで値を生成し、別のスレッドで受信。エラー時はset_exception()で例外を伝播
- 適した場面 : イベント駆動処理、コールバックの結果取得、複雑なスレッド間通信
std::promise<int> promise;
std::future<int> future = promise.get_future();
std::thread t([&promise]() {
std::cout << " [Thread] 処理開始 (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// 時間のかかる処理をシミュレート
std::this_thread::sleep_for(std::chrono::milliseconds(400));
// 処理後に値をセット
int computedValue = 100;
std::cout << " [Thread] 値をセット: " << computedValue << std::endl;
promise.set_value(computedValue);
});
std::cout << " [Main] 結果待ち... (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// 値が設定されるまで待機
int result = future.get();
std::cout << " [Main] 受信した結果: " << result << std::endl;
t.join();
std::packaged_taskを使用するパターン
- 用途 : タスクの作成と実行を分離
- 利点 : タスクを後から実行可能。タスクキューやスレッドプールとの相性が良い。タスクの再利用が容易
- 適した場面 : タスクスケジューラ、ジョブキュー、遅延実行
// タスクを作成(まだ実行されない)
std::packaged_task<int(int, int)> task([](int a, int b) {
std::cout << " [Task] 計算実行 (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// 時間のかかる処理をシミュレート
std::this_thread::sleep_for(std::chrono::milliseconds(300));
int result = a + b;
std::cout << " [Task] 計算完了: " << a << " + " << b << " = " << result << std::endl;
return result;
});
// futureを取得
std::future<int> future = task.get_future();
std::cout << " [Main] タスクを別スレッドで実行 (スレッドID: "
<< std::this_thread::get_id() << ")" << std::endl;
// タスクを別スレッドで実行
std::thread t(std::move(task), 50, 73);
// 結果を取得
int result = future.get();
std::cout << " [Main] 最終結果: " << result << std::endl;
t.join();
今回紹介した方法で実務に適したものを選んでみてください。下画像は上記コードを実行したそれぞれの結果を出力しています

会社紹介
私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています
会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造
この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています
ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します
-
-
アドバンスド・ソリューション株式会社|ADS Co., Ltd.
Microsoft 365/SharePoint/Power Platform/Azure による DX コンサル・シス ...
サイトへ移動