這篇文章主要為大家展示了“C++11標(biāo)準(zhǔn)中
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 |
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 |
設(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)中
另外有需要云服務(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)景需求。