C++ マルチスレッド学習 10 の約束と将来のマルチスレッド非同期値転送

プロセスの実行は断続的であり、プロセスはグリッドに依存しない予測不可能な速度で進行します。スレッドで結果が得られた場合は未定義です。
スレッドの明確な計算結果を取得したい場合は、以前のロック戦略を使用することもできますが、より面倒なので、より簡潔な promise と future を使用する必要があります。

スレッド 1 がスレッド 2 のデータを必要とすると、組み合わせた使用法は次のようになります。

スレッド 1 は promise オブジェクトと future オブジェクトを初期化し、promise はスレッド 2 に渡されます。これは、スレッド 2 がスレッド 1 に対して行った promise と同等です。future は、スレッド 2 によって渡された値を取得するための promise を受け入れることと同等です。スレッド 2 が
promise を取得する 最後に、関連するデータをこの promise に渡す必要があります。その後、スレッド 1 の future がデータを取得できます。
スレッド 1 がデータを取得したいが、スレッド 2 がデータを提供しない場合、スレッド 1 はスレッド 2 のデータが到着するまでブロックします. 簡単な説明プロセス:
source
ここに画像の説明を挿入
: graphic future and promise

future_status には 3 つの状態があります:
(1) deferred: 非同期操作が開始されていません
(2) ready: 非同期操作が完了しました
(3) timeout: 非同期操作がタイムアウトしました

Future は、get()、wait()、wait_for() などのいくつかの関数を提供します:
(1) get() は future の結果を取得します。非同期操作がまだ終わっていない場合は、ここで set_value() が設定されるのを待ちます。共有状態の値。その後、promise の共有状態フラグが準備完了になり、返された結果が取得されます。
(2) ここで wait() は非同期操作の終了を待つだけで、戻り結果を取得できません。
(3) wait_for() は、結果が返されるまでタイムアウトを待ちます。
参考:https://zhuanlan.zhihu.com/p/448035015

未来の図書館を紹介する

#include <thread>
#include <iostream>
#include <future>
#include <string>
using namespace std;

void TestFuture(promise<string> p)
{
    
    
    cout << "begin TestFuture" << endl;
    this_thread::sleep_for(3s);
    cout << "begin set value" << endl;
    p.set_value("TestFuture value");
    this_thread::sleep_for(3s);
    cout << "end TestFuture" << endl;
}

int main(int argc, char* argv[])
{
    
    
    //异步传输变量存储
    promise<string> p;
    //用来获取线程异步值获取
    auto future = p.get_future();
    auto th = thread(TestFuture, move(p));
 
        cout << "future get() = " << future.get() << endl;

    th.join();
    getchar();
    return 0;
}

最初にテスト スレッドの promise p をメイン スレッドに作成し、次に p から future オブジェクトを取得し、このオブジェクトをトークンとして使用して promise P によって生成された値を受け取り、この promise をスレッドの作成時にメイン スレッドに渡し、次にメイン スレッドはトークン値を取得するために、テスト スレッドが値を promise に設定する前に get で待機し、値を設定した後にこの値を返します。 promise メカニズムを使用してスレッドを作成する場合
ここに画像の説明を挿入
、 promise タイプは std::promisestd::string&& 、つまり右辺値参照であるため、ここで P を右辺値として使用できるように move() を使用して、右辺値参照と一致させる必要があります。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42567607/article/details/126075571