91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解C++11標準中<future>頭文件里面的類和相關函數

發布時間:2021-10-15 16:21:55 來源:億速云 閱讀:130 作者:柒染 欄目:編程語言

這篇文章給大家介紹如何理解C++11標準中<future>頭文件里面的類和相關函數,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

介紹 C++11 標準中 <future> 頭文件里面的類和相關函數。

<future> 頭文件中包含了以下幾個類和函數:

Providers 類:std::promise, std::package_task  Futures 類:std::future, shared_future.  Providers 函數:std::async()  其他類型:std::future_error, std::future_errc, std::future_status, std::launch.

std::promise 類介紹

promise 對象可以保存某一類型 T 的值,該值可被 future 對象讀取(可能在另外一個線程中),因此 promise 也提供了一種線程同步的手段。在 promise 對象構造時可以和一個共享狀態(通常是std::future)相關聯,并可以在相關聯的共享狀態(std::future)上保存一個類型為 T 的值。

可以通過 get_future 來獲取與該 promise 對象相關聯的 future 對象,調用該函數之后,兩個對象共享相同的共享狀態(shared state)

promise 對象是異步 Provider,它可以在某一時刻設置共享狀態的值。  future 對象可以異步返回共享狀態的值,或者在必要的情況下阻塞調用者并等待共享狀態標志變為 ready,然后才能獲取共享狀態的值。

下面以一個簡單的例子來說明上述關系

#include <iostream>    // std::cout#include <functional>   // std::ref#include <thread>     // std::thread#include <future>     // std::promise, std::futurevoid print_int(std::future<int>& fut) {  int x = fut.get(); // 獲取共享狀態的值.  std::cout << "value: " << x << '\n'; // 打印 value: 10.}int main (){  std::promise<int> prom; // 生成一個 std::promise<int> 對象.  std::future<int> fut = prom.get_future(); // 和 future 關聯.  std::thread t(print_int, std::ref(fut)); // 將 future 交給另外一個線程t.  prom.set_value(10); // 設置共享狀態的值, 此處和線程t保持同步.  t.join();  return 0;}

std::promise 構造函數

promise();

template <class Alloc> promise (allocator_arg_t aa, const Alloc& alloc);

promise (const promise&) = delete;

promise (promise&& x) noexcept;

default (1)with allocator (2)copy [deleted] (3)move (4)

默認構造函數,初始化一個空的共享狀態。  帶自定義內存分配器的構造函數,與默認構造函數類似,但是使用自定義分配器來分配共享狀態。  拷貝構造函數,被禁用。  移動構造函數。

另外,std::promise 的 operator= 沒有拷貝語義,即 std::promise 普通的賦值操作被禁用,operator= 只有 move 語義,所以 std::promise 對象是禁止拷貝的。

例子:

#include <iostream>    // std::cout#include <thread>     // std::thread#include <future>     // std::promise, std::futurestd::promise<int> prom;void print_global_promise () {  std::future<int> fut = prom.get_future();  int x = fut.get();  std::cout << "value: " << x << '\n';}int main (){  std::thread th2(print_global_promise);  prom.set_value(10);  th2.join();  prom = std::promise<int>();  // prom 被move賦值為一個新的 promise 對象.  std::thread th3 (print_global_promise);  prom.set_value (20);  th3.join(); return 0;}

std::promise::get_future 介紹

該函數返回一個與 promise 共享狀態相關聯的 future 。返回的 future 對象可以訪問由 promise 對象設置在共享狀態上的值或者某個異常對象。只能從 promise 共享狀態獲取一個 future 對象。在調用該函數之后,promise 對象通常會在某個時間點準備好(設置一個值或者一個異常對象),如果不設置值或者異常,promise 對象在析構時會自動地設置一個 future_error 異常(broken_promise)來設置其自身的準備狀態。上面的例子中已經提到了 get_future,此處不再重復。

std::promise::set_value 介紹

void set_value (const T& val);void set_value (T&& val);

void promise<R&>::set_value (R& val);  // when T is a reference type (R&)void promise<void>::set_value (void);  // when T is void

generic template (1)specializations (2)

設置共享狀態的值,此后 promise 的共享狀態標志變為 ready.

std::promise::set_exception 介紹為 promise 設置異常,此后 promise 的共享狀態變標志變為 ready,例子如下,線程1從終端接收一個整數,線程2將該整數打印出來,如果線程1接收一個非整數,則為 promise 設置一個異常(failbit) ,線程2 在std::future::get 是拋出該異常。

#include <iostream>    // std::cin, std::cout, std::ios#include <functional>   // std::ref#include <thread>     // std::thread#include <future>     // std::promise, std::future#include <exception>   // std::exception, std::current_exceptionvoid get_int(std::promise<int>& prom) {  int x;  std::cout << "Please, enter an integer value: ";  std::cin.exceptions (std::ios::failbit);  // throw on failbit  try {    std::cin >> x;             // sets failbit if input is not int    prom.set_value(x);  } catch (std::exception&) {    prom.set_exception(std::current_exception());  }}void print_int(std::future<int>& fut) {  try {    int x = fut.get();    std::cout << "value: " << x << '\n';  } catch (std::exception& e) {    std::cout << "[exception caught: " << e.what() << "]\n";  }}int main (){  std::promise<int> prom;  std::future<int> fut = prom.get_future();  std::thread th2(get_int, std::ref(prom));  std::thread th3(print_int, std::ref(fut));  th2.join();  th3.join();  return 0;}

std::promise::set_value_at_thread_exit 介紹

設置共享狀態的值,但是不將共享狀態的標志設置為 ready,當線程退出時該 promise 對象會自動設置為 ready。如果某個 std::future 對象與該 promise 對象的共享狀態相關聯,并且該 future 正在調用 get,則調用 get 的線程會被阻塞,當線程退出時,調用 future::get 的線程解除阻塞,同時 get 返回 set_value_at_thread_exit 所設置的值。注意,該函數已經設置了 promise 共享狀態的值,如果在線程結束之前有其他設置或者修改共享狀態的值的操作,則會拋出 future_error( promise_already_satisfied )。

std::promise::swap 介紹

交換 promise 的共享狀態。

關于如何理解C++11標準中<future>頭文件里面的類和相關函數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

德钦县| 察哈| 白朗县| 昌平区| 横峰县| 耒阳市| 芜湖县| 容城县| 抚顺县| 庆城县| 弋阳县| 沭阳县| 玛纳斯县| 莒南县| 山丹县| 九台市| 昂仁县| 通州区| 东台市| 泸水县| 蒙山县| 雅江县| 乃东县| 马龙县| 台东市| 稷山县| 台南县| 永登县| 乌拉特中旗| 临邑县| 当涂县| 龙南县| 辽宁省| 凌海市| 洛扎县| 邹城市| 金阳县| 西平县| 法库县| 大冶市| 东乌珠穆沁旗|