名前空間
変種
操作

std::promise

From cppreference.com
< cpp‎ | thread
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
promise
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
ヘッダ <future> で定義
template< class R > class promise;
(1) (C++11以降)
template< class R > class promise<R&>;
(2) (C++11以降)
template<> class promise<void>;
(3) (C++11以降)
1) 基本テンプレート。
2) void以外の特殊化。スレッド間でオブジェクトを通信するために使用されます。
3) void特殊化。ステートレスなイベントを通信するために使用されます。

クラステンプレート `std::promise` は、`std::promise` オブジェクトによって作成された std::future オブジェクトを介して後で非同期的に取得される値または例外を格納する機能を提供します。`std::promise` オブジェクトは一度だけ使用することを意図しています。

各プロミスは、何らかの状態情報と、まだ評価されていない、値(voidである可能性もある)に評価された、または例外に評価された「結果」を含む「共有状態」に関連付けられています。プロミスは共有状態に対して次の3つのことができます。

  • 準備完了にする:プロミスは結果または例外を共有状態に格納します。状態を準備完了とマークし、共有状態に関連付けられた future で待機しているすべてのスレッドをブロック解除します。
  • 解放する:プロミスは共有状態への参照を放棄します。これが最後の参照だった場合、共有状態は破棄されます。まだ準備ができていない std::async によって作成された共有状態でない限り、この操作はブロックしません。
  • 放棄する:プロミスはエラーコード std::future_errc::broken_promise を持つ std::future_error 型の例外を格納し、共有状態を準備完了にし、その後解放します。

プロミスは、プロミス-フューチャ通信チャネルの「プッシュ」側です。共有状態に値を格納する操作は、共有状態を待機している関数(std::future::getなど)からの成功した戻り値と同期しますstd::memory_orderで定義されています)。そうでない場合、同じ共有状態への並行アクセスは競合する可能性があります。例えば、std::shared_future::getの複数の呼び出し元は、すべて読み取り専用であるか、外部同期を提供する必要があります。

目次

[編集] メンバ関数

promiseオブジェクトを構築する
(public member function) [編集]
promiseオブジェクトを破棄する
(public member function) [編集]
共有状態を割り当てる
(public member function) [編集]
2つのpromiseオブジェクトを入れ替える
(public member function) [編集]
結果の取得
約束された結果に関連付けられた future を返す
(public member function) [編集]
結果の設定
結果を特定の値に設定する
(public member function) [編集]
スレッド終了時のみ通知を配信し、結果を特定の値に設定する
(public member function) [編集]
結果が例外を示すように設定する
(public member function) [編集]
スレッド終了時のみ通知を配信し、結果が例外を示すように設定する
(public member function) [編集]

[編集] 非メンバ関数

std::swap アルゴリズムを特殊化する
(関数テンプレート) [編集]

[編集] ヘルパークラス

std::uses_allocator 型特性を特殊化する
(クラステンプレート特殊化) [編集]

[編集]

この例は、`promise` がスレッド間のシグナルとしてどのように使用できるかを示しています。

#include <chrono>
#include <future>
#include <iostream>
#include <numeric>
#include <thread>
#include <vector>
 
void accumulate(std::vector<int>::iterator first,
                std::vector<int>::iterator last,
                std::promise<int> accumulate_promise)
{
    int sum = std::accumulate(first, last, 0);
    accumulate_promise.set_value(sum); // Notify future
}
 
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
 
int main()
{
    // Demonstrate using promise<int> to transmit a result between threads.
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    std::promise<int> accumulate_promise;
    std::future<int> accumulate_future = accumulate_promise.get_future();
    std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
                            std::move(accumulate_promise));
 
    // future::get() will wait until the future has a valid result and retrieves it.
    // Calling wait() before get() is not needed
    // accumulate_future.wait(); // wait for result
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // wait for thread completion
 
    // Demonstrate using promise<void> to signal state between threads.
    std::promise<void> barrier;
    std::future<void> barrier_future = barrier.get_future();
    std::thread new_work_thread(do_work, std::move(barrier));
    barrier_future.wait();
    new_work_thread.join();
}

出力

result=21
English 日本語 中文(简体) 中文(繁體)