Namespaces
Variants

std:: promise

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
promise
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
ヘッダーで定義 <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 オブジェクトは一度だけ使用されることを意図していることに注意してください。

各プロミスは shared state に関連付けられており、これにはいくつかの状態情報と、まだ評価されていない値(voidの場合もあり)、値として評価された結果、または例外として評価された結果である result が含まれます。プロミスはshared stateに対して3つの操作を行うことができます:

  • make ready : promiseは結果または例外を共有状態に格納します。状態をreadyに設定し、共有状態に関連付けられたfutureを待機しているスレッドのブロックを解除します。
  • release : promiseは共有状態への参照を放棄します。これが最後の参照であった場合、共有状態は破棄されます。これがまだreadyになっていない std:: async によって作成された共有状態でない限り、この操作はブロックしません。
  • abandon : promiseは std::future_error 型の例外をエラーコード std::future_errc::broken_promise で格納し、共有状態を ready にした後、 release します。

promiseはpromise-future通信チャネルの「push」側である:共有状態に値を格納する操作は、 synchronizes-with std::memory_order で定義される通り)共有状態を待機する任意の関数(例えば std::future::get など)からの正常復帰と同期する。同じ共有状態への並行アクセスは、それ以外の場合には競合する可能性がある:例えば 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)

非メンバー関数

</table
std::swap アルゴリズムを特殊化
(関数テンプレート)

ヘルパークラス

std::uses_allocator 型特性を特殊化
(クラステンプレートの特殊化)

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

#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); // futureに通知
}
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
int main()
{
    // promise<int>を使用してスレッド間で結果を伝達するデモンストレーション
    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()はfutureが有効な結果を持つまで待機し、それを取得します
    // get()の前にwait()を呼び出す必要はありません
    // accumulate_future.wait(); // 結果を待機
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // スレッドの完了を待機
    // promise<void>を使用してスレッド間で状態を通知するデモンストレーション
    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