真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++11標(biāo)準(zhǔn)中<future>的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“C++11標(biāo)準(zhǔn)中的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++11標(biāo)準(zhǔn)中的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供雙峰企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站制作html5、小程序制作等業(yè)務(wù)。10年已為雙峰眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

頭文件中包含了以下幾個(gè)類和函數(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 對(duì)象可以保存某一類型 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è)類型為 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     // std::cout
#include    // std::ref
#include      // std::thread
#include      // std::promise, std::future

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

int main ()
{
  std::promise prom; // 生成一個(gè) std::promise 對(duì)象.
  std::future 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  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)分配共享狀態(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     // std::cout
#include      // std::thread
#include      // std::promise, std::future

std::promise prom;

void print_global_promise () {
  std::future 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();  // prom 被move賦值為一個(gè)新的 promise 對(duì)象.

  std::thread th3 (print_global_promise);
  prom.set_value (20);
  th3.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::set_value (R& val);  // when T is a reference type (R&)
void promise::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     // std::cin, std::cout, std::ios
#include    // std::ref
#include      // std::thread
#include      // std::promise, std::future
#include    // std::exception, std::current_exception

void get_int(std::promise& 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& 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 prom;
  std::future 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 介紹

設(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 )。

以上是“C++11標(biāo)準(zhǔn)中的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)站標(biāo)題:C++11標(biāo)準(zhǔn)中&lt;future&gt;的示例分析-創(chuàng)新互聯(lián)
URL地址:http://weahome.cn/article/ccicid.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部