最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11 <future>中std::promise 介紹

 更新時間:2020年02月06日 11:20:38   作者:Haippy  
這篇文章主要介紹了C++11 <future>中std::promise 介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

前面兩講《C++11 并發(fā)指南二(std::thread 詳解) 》,《C++11 并發(fā)指南三(std::mutex 詳解) 》分別介紹了 std::thread 和 std::mutex,相信讀者對 C++11 中的多線程編程有了一個最基本的認識,本文將介紹 C++11 標準中 <future> 頭文件里面的類和相關(guān)函數(shù)。

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

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

std::promise 類介紹

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

可以通過 get_future 來獲取與該 promise 對象相關(guān)聯(lián)的 future 對象,調(diào)用該函數(shù)之后,兩個對象共享相同的共享狀態(tài)(shared state)

  • promise 對象是異步 Provider,它可以在某一時刻設(shè)置共享狀態(tài)的值。
  • future 對象可以異步返回共享狀態(tài)的值,或者在必要的情況下阻塞調(diào)用者并等待共享狀態(tài)標志變?yōu)?ready,然后才能獲取共享狀態(tài)的值。

下面以一個簡單的例子來說明上述關(guān)系

#include <iostream>    // std::cout
#include <functional>   // std::ref
#include <thread>     // std::thread
#include <future>     // std::promise, std::future

void print_int(std::future<int>& fut) {
  int x = fut.get(); // 獲取共享狀態(tài)的值.
  std::cout << "value: " << x << '\n'; // 打印 value: 10.
}

int main ()
{
  std::promise<int> prom; // 生成一個 std::promise<int> 對象.
  std::future<int> fut = prom.get_future(); // 和 future 關(guān)聯(lián).
  std::thread t(print_int, std::ref(fut)); // 將 future 交給另外一個線程t.
  prom.set_value(10); // 設(shè)置共享狀態(tài)的值, 此處和線程t保持同步.
  t.join();
  return 0;
}

std::promise 構(gòu)造函數(shù)

default (1)
promise();
with allocator (2)
template <class Alloc> promise (allocator_arg_t aa, const Alloc& alloc);
copy [deleted] (3)
promise (const promise&) = delete;
move (4)
promise (promise&& x) noexcept;

  • 默認構(gòu)造函數(shù),初始化一個空的共享狀態(tài)。
  • 帶自定義內(nèi)存分配器的構(gòu)造函數(shù),與默認構(gòu)造函數(shù)類似,但是使用自定義分配器來分配共享狀態(tài)。
  • 拷貝構(gòu)造函數(shù),被禁用。
  • 移動構(gòu)造函數(shù)。

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

例子:

#include <iostream>    // std::cout
#include <thread>     // std::thread
#include <future>     // std::promise, std::future

std::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 th1(print_global_promise);
  prom.set_value(10);
  th1.join();

  prom = std::promise<int>();  // prom 被move賦值為一個新的 promise 對象.

  std::thread th2 (print_global_promise);
  prom.set_value (20);
  th2.join();

 return 0;
}

std::promise::get_future 介紹

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

std::promise::set_value 介紹

generic template (1)
void set_value (const T& val);
void set_value (T&& val);
specializations (2)
void promise<R&>::set_value (R& val);  // when T is a reference type (R&)
void promise<void>::set_value (void);  // when T is void

設(shè)置共享狀態(tài)的值,此后 promise 的共享狀態(tài)標志變?yōu)?ready.

 std::promise::set_exception 介紹
為 promise 設(shè)置異常,此后 promise 的共享狀態(tài)變標志變?yōu)?ready,例子如下,線程1從終端接收一個整數(shù),線程2將該整數(shù)打印出來,如果線程1接收一個非整數(shù),則為 promise 設(shè)置一個異常(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_exception

void 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 th1(get_int, std::ref(prom));
  std::thread th2(print_int, std::ref(fut));

  th1.join();
  th2.join();
  return 0;
}

std::promise::set_value_at_thread_exit 介紹

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

std::promise::swap 介紹

交換 promise 的共享狀態(tài)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis的新特性懶惰刪除Lazy Free詳解

    Redis的新特性懶惰刪除Lazy Free詳解

    這篇文章主要介紹了Redis的新特性懶惰刪除Lazy Free詳解,Redis4.0新增了非常實用的lazy free特性,從根本上解決Big Key(主要指定元素較多集合類型Key)刪除的風險,需要的朋友可以參考下
    2019-06-06
  • C++實現(xiàn)單例模式的自動釋放

    C++實現(xiàn)單例模式的自動釋放

    這篇文章主要為大家詳細介紹了C++實現(xiàn)單例模式的自動釋放,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言實現(xiàn)家庭理財系統(tǒng)

    C語言實現(xiàn)家庭理財系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)家庭理財系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言 數(shù)與串之間轉(zhuǎn)換的方法

    C語言 數(shù)與串之間轉(zhuǎn)換的方法

    C語言 數(shù)與串之間轉(zhuǎn)換的方法,需要的朋友可以參考一下
    2013-05-05
  • C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用

    C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用

    strcpy和memcpy都是標準C庫函數(shù),strcpy提供了字符串的復(fù)制而memcpy提供了一般內(nèi)存的復(fù)制。下面通過本文重點給大家介紹C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用,非常不錯,感興趣的朋友一起看下吧
    2016-08-08
  • C語言MFC基礎(chǔ)之計算器詳解

    C語言MFC基礎(chǔ)之計算器詳解

    這篇文章主要為大家介紹了MFC實現(xiàn)簡單的計算器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-08-08
  • 基于Qt+OpenCV實現(xiàn)圖像灰度化像素

    基于Qt+OpenCV實現(xiàn)圖像灰度化像素

    在圖像處理領(lǐng)域,OpenCV是一款強大而廣泛應(yīng)用的開源庫,能夠提供豐富的圖像處理和計算機視覺功能,本文將介紹如何利用Qt?編輯器調(diào)用OpenCV庫對照片進行換底色處理,實現(xiàn)更加獨特和吸引人的效果
    2023-11-11
  • VC WinExec打開指定程序或者文件的方法

    VC WinExec打開指定程序或者文件的方法

    使用WinExec命令打開指定程序或者文件的參數(shù)說明
    2008-11-11
  • 使用WindowsAPI獲取錄音音頻的方法

    使用WindowsAPI獲取錄音音頻的方法

    這篇文章主要介紹了使用WindowsAPI獲取錄音音頻的方法,非常實用的功能,需要的朋友可以參考下
    2014-08-08
  • C語言實現(xiàn)鏈隊列代碼

    C語言實現(xiàn)鏈隊列代碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)鏈隊列代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

安乡县| 临洮县| 大英县| 内丘县| 北安市| 富阳市| 宁强县| 德钦县| 那曲县| 惠东县| 会同县| 永嘉县| 哈尔滨市| 什邡市| 鲁山县| 牙克石市| 西乌| 纳雍县| 定陶县| 三明市| 砚山县| 宣汉县| 庆元县| 迁安市| 茂名市| 永嘉县| 资阳市| 肥东县| 佛冈县| 出国| 溆浦县| 无锡市| 阿图什市| 东莞市| 清原| 谷城县| 革吉县| 绥滨县| 安塞县| 左权县| 禹州市|