名前空間
変種
操作

std::shared_future

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
(C++11)
(C++11)
shared_future
(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 T > class shared_future;
(1) (C++11以降)
template< class T > class shared_future<T&>;
(2) (C++11以降)
template<> class shared_future<void>;
(3) (C++11以降)

クラステンプレートstd::shared_futureは、非同期操作の結果にアクセスするためのメカニズムを提供します。これはstd::futureに似ていますが、複数のスレッドが同じ共有状態を待機することが許可されている点が異なります。唯一移動可能(したがって、1つのインスタンスのみが特定の結果を参照できる)であるstd::futureとは異なり、std::shared_futureはコピー可能であり、複数のshared_futureオブジェクトが同じ共有状態を参照できます。

複数のスレッドからの同じ共有状態へのアクセスは、各スレッドがそれをshared_futureオブジェクトの独自のコピーを介して行う場合、安全です。

目次

[編集] メンバ関数

futureオブジェクトを構築します。
(public member function) [編集]
futureオブジェクトを破棄します。
(public member function)
内容を代入する
(public member function)
結果の取得
結果を返します。
(public member function) [編集]
状態 (State)
futureが共有状態を持っているかどうかをチェックします。
(public member function) [編集]
結果が利用可能になるまで待機します。
(public member function) [編集]
指定されたタイムアウト時間内に結果が利用可能でない場合、待機して戻ります。
(public member function) [編集]
指定された時刻までに結果が利用可能でない場合、待機して戻ります。
(public member function) [編集]

[編集]

shared_futureは、std::condition_variable::notify_all()と同様に、複数のスレッドに同時にシグナルを送信するために使用できます。

#include <chrono>
#include <future>
#include <iostream>
 
int main()
{   
    std::promise<void> ready_promise, t1_ready_promise, t2_ready_promise;
    std::shared_future<void> ready_future(ready_promise.get_future());
 
    std::chrono::time_point<std::chrono::high_resolution_clock> start;
 
    auto fun1 = [&, ready_future]() -> std::chrono::duration<double, std::milli> 
    {
        t1_ready_promise.set_value();
        ready_future.wait(); // waits for the signal from main()
        return std::chrono::high_resolution_clock::now() - start;
    };
 
 
    auto fun2 = [&, ready_future]() -> std::chrono::duration<double, std::milli> 
    {
        t2_ready_promise.set_value();
        ready_future.wait(); // waits for the signal from main()
        return std::chrono::high_resolution_clock::now() - start;
    };
 
    auto fut1 = t1_ready_promise.get_future();
    auto fut2 = t2_ready_promise.get_future();
 
    auto result1 = std::async(std::launch::async, fun1);
    auto result2 = std::async(std::launch::async, fun2);
 
    // wait for the threads to become ready
    fut1.wait();
    fut2.wait();
 
    // the threads are ready, start the clock
    start = std::chrono::high_resolution_clock::now();
 
    // signal the threads to go
    ready_promise.set_value();
 
    std::cout << "Thread 1 received the signal "
              << result1.get().count() << " ms after start\n"
              << "Thread 2 received the signal "
              << result2.get().count() << " ms after start\n";
}

実行結果の例

Thread 1 received the signal 0.072 ms after start
Thread 2 received the signal 0.041 ms after start

[編集] 関連項目

(C++11)
関数を非同期に(場合によっては新しいスレッドで)実行し、結果を保持する std::future を返す
(関数テンプレート) [編集]
(C++11)
非同期に設定される値を待機する
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)