欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

std::promise 類(lèi)介紹

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

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

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

下面以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明上述關(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; // 生成一個(gè) std::promise<int> 對(duì)象.
  std::future<int> fut = prom.get_future(); // 和 future 關(guān)聯(lián).
  std::thread t(print_int, std::ref(fut)); // 將 future 交給另外一個(gè)線程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;

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

另外,std::promise 的 operator= 沒(méi)有拷貝語(yǔ)義,即 std::promise 普通的賦值操作被禁用,operator= 只有 move 語(yǔ)義,所以 std::promise 對(duì)象是禁止拷貝的。

例子:

#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賦值為一個(gè)新的 promise 對(duì)象.

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

 return 0;
}

std::promise::get_future 介紹

該函數(shù)返回一個(gè)與 promise 共享狀態(tài)相關(guān)聯(lián)的 future 。返回的 future 對(duì)象可以訪問(wèn)由 promise 對(duì)象設(shè)置在共享狀態(tài)上的值或者某個(gè)異常對(duì)象。只能從 promise 共享狀態(tài)獲取一個(gè) future 對(duì)象。在調(diào)用該函數(shù)之后,promise 對(duì)象通常會(huì)在某個(gè)時(shí)間點(diǎn)準(zhǔn)備好(設(shè)置一個(gè)值或者一個(gè)異常對(duì)象),如果不設(shè)置值或者異常,promise 對(duì)象在析構(gòu)時(shí)會(huì)自動(dòng)地設(shè)置一個(gè) future_error 異常(broken_promise)來(lái)設(shè)置其自身的準(zhǔn)備狀態(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)標(biāo)志變?yōu)?ready.

 std::promise::set_exception 介紹
為 promise 設(shè)置異常,此后 promise 的共享狀態(tài)變標(biāo)志變?yōu)?ready,例子如下,線程1從終端接收一個(gè)整數(shù),線程2將該整數(shù)打印出來(lái),如果線程1接收一個(gè)非整數(shù),則為 promise 設(shè)置一個(gè)異常(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)的標(biāo)志設(shè)置為 ready,當(dāng)線程退出時(shí)該 promise 對(duì)象會(huì)自動(dòng)設(shè)置為 ready。如果某個(gè) std::future 對(duì)象與該 promise 對(duì)象的共享狀態(tài)相關(guān)聯(lián),并且該 future 正在調(diào)用 get,則調(diào)用 get 的線程會(huì)被阻塞,當(dāng)線程退出時(shí),調(diào)用 future::get 的線程解除阻塞,同時(shí) get 返回 set_value_at_thread_exit 所設(shè)置的值。注意,該函數(shù)已經(jīng)設(shè)置了 promise 共享狀態(tài)的值,如果在線程結(jié)束之前有其他設(shè)置或者修改共享狀態(tài)的值的操作,則會(huì)拋出 future_error( promise_already_satisfied )。

std::promise::swap 介紹

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

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

相關(guān)文章

  • C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)

    C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)

    C++編譯器會(huì)把代碼直接分為四個(gè)小區(qū),弄懂這四小區(qū)對(duì)我們理解內(nèi)存有所幫助,所以下面這篇文章主要給大家介紹了關(guān)于C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++ 基本算法 冒泡法、交換法、選擇法、實(shí)現(xiàn)代碼集合

    C++ 基本算法 冒泡法、交換法、選擇法、實(shí)現(xiàn)代碼集合

    大家在學(xué)習(xí)C語(yǔ)言的時(shí)候,老師可能都會(huì)講的幾個(gè)算法,這里簡(jiǎn)單整理下,方便需要的朋友
    2013-04-04
  • 使用ShellClass獲取文件屬性詳細(xì)信息的實(shí)現(xiàn)方法

    使用ShellClass獲取文件屬性詳細(xì)信息的實(shí)現(xiàn)方法

    本篇文章是對(duì)ShellClass獲取文件屬性詳細(xì)信息的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C/C++ 原生API實(shí)現(xiàn)線程池的方法

    C/C++ 原生API實(shí)現(xiàn)線程池的方法

    線程池,簡(jiǎn)單來(lái)說(shuō)就是有一堆已經(jīng)創(chuàng)建好的線程,接下來(lái)通過(guò)本文給大家介紹C/C++ 原生API實(shí)現(xiàn)線程池的方法,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • C++中進(jìn)行txt文件讀入和寫(xiě)入的方法示例

    C++中進(jìn)行txt文件讀入和寫(xiě)入的方法示例

    這篇文章主要給大家介紹了C++中進(jìn)行txt文件讀入和寫(xiě)入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 淺談QT內(nèi)存泄漏

    淺談QT內(nèi)存泄漏

    本文主要介紹了淺談QT內(nèi)存泄漏,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Qt中QStringList與QString的常用方法總結(jié)

    Qt中QStringList與QString的常用方法總結(jié)

    這篇文章主要為大家總結(jié)了Qt中QString 與 (QStringList | QByteArray)之間的轉(zhuǎn)換,以及QString、QStringList的一些常用方法,感興趣的可以收藏一下
    2022-12-12
  • c++ 排查內(nèi)存泄漏的妙招

    c++ 排查內(nèi)存泄漏的妙招

    這篇文章主要介紹了c++ 如何用輔助類(lèi)排查內(nèi)存泄漏,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • QT與MATLAB混合編程的詳細(xì)教程

    QT與MATLAB混合編程的詳細(xì)教程

    最近項(xiàng)目需要,matlab的一些算法需要工程用,因此需要直接轉(zhuǎn)成Qt能夠調(diào)用的形式,下面這篇文章主要給大家介紹了關(guān)于QT與MATLAB混合編程的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 一文掌握C語(yǔ)言中的柔性數(shù)組

    一文掌握C語(yǔ)言中的柔性數(shù)組

    柔性數(shù)組在C語(yǔ)言的?C99?標(biāo)準(zhǔn)中,引入的新特性,結(jié)構(gòu)中的最后一個(gè)元素的大小允許是未知的數(shù)組,即為柔性數(shù)組,本文給大家介紹c語(yǔ)言中的柔性數(shù)組,感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評(píng)論