當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ std::future用法及代碼示例


C++ 並發支持庫包括 std::future 類模板,該模板自 C++11 起可用。該模板在 <future> 標頭中定義,並提供訪問異步操作結果的方法。

C++ 中的 std::future 是什麽?

在 C++ 中,std::future 是一個類模板,用於接收尚未計算的異步執行任務的結果,即未來值。 C++ 中的異步操作使用 std::async、std::packaged_task 或 std::promise 進行管理,後者返回 std::future 對象。我們可以使用這個 std::future 對象來驗證、等待或獲取操作的結果。

需要注意的是,我們在程序中隻能接收一次計算結果,因為在獲得結果後會重置未來的狀態。

std::future 的語法

定義 std::future 對象的語法非常簡單:

std::future<type> name;

其中,

  • name:未來對象的名稱。
  • type:要接收的數據類型。

std::future 類中的成員函數

std::future 類由提供基本函數的各種成員函數組成。一些常見的有:

S. No.

Function

Description

1

get() 獲取收到的值的函數。

2

wait() 該函數告訴編譯器wait()來完成該過程。

3

wait_for() 此函數告訴編譯器 wait() 在指定的持續時間內完成進程。

4

wait_until() 該函數告訴編譯器 wait() 直到指定的持續時間完成該過程。

5

valid() 該函數檢查future()對象是否具有共享狀態,即執行get()操作是否有效。

C++ 中 std::future 的示例

示例1:使用std::future打印異步任務的返回值

C++


// C++ Program to illustrate the use of std::future 
#include <chrono> 
#include <future> 
#include <iostream> 
using namespace std; 
  
// A simple function that returns some integer value 
int returnTwo() { return 2; } 
  
// driver code 
int main() 
{ 
    // creating a future object and a thread that executes 
    // the function return two asynchronously 
    future<int> f = async(launch::async, returnTwo); 
  
    // getting and printing the result 
    cout << f.get(); 
  
    return 0; 
}

輸出

2

示例 2:嘗試從 std::future 多次獲取值

C++


// C++ Program to illustrate the use of std::future 
#include <chrono> 
#include <future> 
#include <iostream> 
using namespace std; 
  
// A simple function that returns some integer value 
int returnTwo() { return 2; } 
  
// driver code 
int main() 
{ 
    // creating a future object and a thread that executes 
    // the function return two asynchronously 
    future<int> f = async(launch::async, returnTwo); 
  
    // getting and printing the result 
    cout << f.get(); 
  
    // trying for second time 
    cout << f.get(); 
  
    return 0; 
}

輸出

terminate called after throwing an instance of 'std::future_error'
  what():  std::future_error: No associated state

上述問題的解決方案是在使用get()方法之前使用future::valid()函數檢查未來對象的狀態。

示例 3:使用 valid() 避免無關聯狀態錯誤

C++


// C++ Program to illustrate the use of std::future 
#include <chrono> 
#include <future> 
#include <iostream> 
using namespace std; 
  
// A simple function that returns some integer value 
int returnTwo() { return 2; } 
  
// driver code 
int main() 
{ 
    // creating a future object and a thread that executes 
    // the function return two asynchronously 
    future<int> f = async(launch::async, returnTwo); 
  
    // getting and printing the result 
    if (f.valid()) { 
        cout << f.get() << endl; 
    } 
    else { 
        cout << "Invalid State, Please create another Task"
             << endl; 
    } 
    // trying for second time 
    if (f.valid()) { 
        cout << f.get() << endl; 
    } 
    else { 
        cout << "Invalid State, Please create another Task"
             << endl; 
    } 
  
    return 0; 
}

輸出

2
Invalid State, Please create another Task

除了 async() 方法之外,我們還可以使用 std::packaged_task() 和 std::promise( 來獲取 future 對象。下麵的示例演示了 std::future 與 std::promise 的使用。

示例 4:將 std::future 與 std::promise 一起使用

C++


// C++ Program to illustrate the use of std::future 
#include <chrono> 
#include <future> 
#include <iostream> 
using namespace std; 
  
// A simple function that returns some integer value 
void foo(promise<int> p) { p.set_value(25); } 
  
// driver code 
int main() 
{ 
    // creating a future object and a thread that executes 
    // the function return two asynchronously 
  
    promise<int> p; 
    future<int> f = p.get_future(); 
    ; 
  
    // moving the task 
    thread t(foo, move(p)); 
  
    t.join(); 
    cout << f.get(); 
  
    return 0; 
}

輸出

25

結論

std::future為程序員提供了一種簡單的方式在C++異步編程中進行線程通信的方法。當我們需要在後台執行某些任務並需要在主進程中獲得該任務的結果時,它特別有用。



相關用法


注:本文由純淨天空篩選整理自saurabh1975大神的英文原創作品 std::future in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。