日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++11 并发指南四(future 详解一 std::promise 介绍)

發布時間:2025/3/15 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11 并发指南四(future 详解一 std::promise 介绍) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面兩講《C++11 并發指南二(std::thread 詳解)》,《C++11 并發指南三(std::mutex 詳解)》分別介紹了 std::thread 和 std::mutex,相信讀者對 C++11 中的多線程編程有了一個最基本的認識,本文將介紹 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 構造函數

default (1)with allocator (2)copy [deleted] (3)move (4)
promise();
template <class Alloc> promise (allocator_arg_t aa, const Alloc& alloc);
promise (const promise&) = delete;
promise (promise&& x) noexcept;
  • 默認構造函數,初始化一個空的共享狀態。
  • 帶自定義內存分配器的構造函數,與默認構造函數類似,但是使用自定義分配器來分配共享狀態。
  • 拷貝構造函數,被禁用。
  • 移動構造函數。
  • 另外,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 介紹

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

    std::promise::set_value 介紹

    generic template (1)specializations (2)
    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

    設置共享狀態的值,此后 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 failbittry {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 介紹

    設置共享狀態的值,但是不將共享狀態的標志設置為 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 详解一 std::promise 介绍)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久久一级黄色片 | 中文字幕乱码一区二区三区 | 免费荫蒂添的好舒服视频 | 在线视频一区二区三区四区 | 天天干 夜夜操 | 最新亚洲精品 | 成人亚洲欧美 | 日韩无| 天天碰天天摸 | 久久久久视 | 国产男同gay网站 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 丁香亚洲 | 成人二区三区 | 嫩草99 | 国产午夜在线观看 | 国产免费av一区二区 | jizz欧美性11| 天天插日日插 | 黄色片的网站 | 成人激情社区 | 黄色片女人| 亚洲色图欧美日韩 | 精品久久影院 | 国产精品第十页 | 六月丁香婷婷综合 | 91国产在线播放 | 天天曰天天操 | 狠狠热免费视频 | 日本久久成人 | 亚洲卡一卡二 | proumb性欧美在线观看 | 少妇性生活视频 | 真人抽搐一进一出视频 | 欧美日韩国产免费 | 色窝网 | 国产精选自拍 | www国产无套内射com | 性a视频 | 爱看av在线| 嫩草影院中文字幕 | 操碰91 | 日本妈妈3 | 日韩欧美在线免费 | 黄色网址在线免费观看 | 亚洲一区中文字幕在线 | 国产三级自拍视频 | 天堂在线中文字幕 | 日韩精品免费视频 | 毛片免费在线观看视频 | 亚洲人成电影网 | 日本成人性爱 | 麻豆视频一区 | 日韩精品视频中文字幕 | 国产精品制服诱惑 | 天天久久综合 | 成人av网站在线 | 欧美xo影院 | 色在线综合 | 国产丝袜美女 | 成人3d动漫在线观看 | 国产一区网| 日本一区二区人妻 | 91蝌蚪视频在线 | 日韩欧美在线观看一区二区三区 | av大全免费观看 | 亚洲一区自拍偷拍 | 日韩av无码中文字幕 | 免费看污片网站 | 中国少妇无码专区 | 贵族女沦为官妓h呻吟 | 在线只有精品 | 亚洲天堂免费在线观看视频 | 蜜桃视频无码区在线观看 | 亚洲一区二区在线观看视频 | 小嫩嫩精品导航 | 国产精品精品视频 | 久久一区二区三区视频 | 69久久 | 欧美性生活一区 | 日韩在线视频第一页 | 一区国产在线 | 黄色高清无遮挡 | 99嫩草 | 九色一区| 狠狠综合久久av一区二区 | 中文字幕久久久久久久 | 99久久久久 | 色图一区 | 人人看人人做 | 亚洲Av无码成人精品区伊人 | 国产精品久久久久久久午夜 | 日本精品在线一区 | 久久tv| 国产精品伦一区二区三级视频 | 国产视频久久久 | 蜜桃av一区二区三区 | 性做久久久久久免费观看 | av永久免费观看 |