C++11中std::shared_future的使用
C++11中的std::shared_future是個(gè)模板類。與std::future類似,std::shared_future提供了一種訪問異步操作結(jié)果的機(jī)制;不同于std::future,std::shared_future允許多個(gè)線程等待同一個(gè)共享狀態(tài);不同于std::future僅支持移動(dòng)操作,std::shared_future既支持移動(dòng)操作也支持拷貝操作,而且多個(gè)shared_future對(duì)象可以引用相同的共享狀態(tài)。std::shared_future還允許一旦共享狀態(tài)就緒就可以多次檢索共享狀態(tài)下的值(A shared_future object behaves like a future object, except that it can be copied, and that more than one shared_future can share ownership over their end of a shared state. They also allow the value in the shared state to be retrieved multiple times once ready)。
std::shared_future對(duì)象可以通過std::future對(duì)象隱式轉(zhuǎn)換,也可以通過顯示調(diào)用std::future::share顯示轉(zhuǎn)換,在這兩種情況下,原std::future對(duì)象都將變得無效。
共享狀態(tài)(shared state)的生存期至少要持續(xù)到與之關(guān)聯(lián)的最后一個(gè)對(duì)象被銷毀為止。與std::future不同,通過shared_future::get檢索的值不會(huì)釋放共享對(duì)象的所有權(quán)。
std::future介紹參考:https://blog.csdn.net/fengbingchun/article/details/104115489
當(dāng)你需要具有std::future的多個(gè)有效拷貝時(shí)會(huì)用到std::shared_future;或者多個(gè)使用者使用std::future時(shí)也會(huì)用到std::shared_future。
Consider std::future, std::shared_future to be like std::unique_ptr, std::shared_ptr.
模板類std::shared_future成員函數(shù)包括:
1. 構(gòu)造函數(shù):(1).不帶參數(shù)的默認(rèn)構(gòu)造函數(shù),此對(duì)象沒有共享狀態(tài),因此它是無效的,但是它可以被賦予一個(gè)有效值;(2).拷貝構(gòu)造:與const shared_future& x具有相同的共享狀態(tài),并與之共享所有權(quán);(3).支持移動(dòng)構(gòu)造。
2. 析構(gòu)函數(shù):銷毀shared_future對(duì)象,它是異常安全的。如果對(duì)象有效(即它可以訪問共享狀態(tài)),則將其與對(duì)象接觸關(guān)聯(lián);如果它是與共享狀態(tài)關(guān)聯(lián)的唯一對(duì)象,則共享對(duì)象本身也將被銷毀。
3. get函數(shù):(1).當(dāng)共享狀態(tài)就緒時(shí),返回存儲(chǔ)在共享狀態(tài)中的值的引用(或拋出異常)。(2).如果共享狀態(tài)尚未就緒(即provider提供者尚未設(shè)置其值或異常),則該函數(shù)將阻塞調(diào)用的線程直到就緒。(3).當(dāng)共享狀態(tài)就緒后,則該函數(shù)將解除阻塞并返回(或拋出),但與future::get不同,不會(huì)釋放其共享狀態(tài),允許其它shared_future對(duì)象也訪問存儲(chǔ)的值。(4).std::shared_future<void>::get()不返回任何值,但仍等待共享狀態(tài)就緒才返回或拋出。
4. operator=:(1).拷貝賦值:該對(duì)象與const shared_future& rhs關(guān)聯(lián)到相同的共享狀態(tài),并與之共享所有權(quán);(2).移動(dòng)賦值:該對(duì)象獲取shared_future&& rhs的共享狀態(tài),rhs不再有效。
5. valid函數(shù):檢查共享狀態(tài)的有效性,返回當(dāng)前的shared_future對(duì)象是否與共享狀態(tài)關(guān)聯(lián)。
6. wait函數(shù):(1).等待共享狀態(tài)就緒。(2).如果共享狀態(tài)尚未就緒(即提供者尚未設(shè)置其值或異常),則該函數(shù)將阻塞調(diào)用的線程直到就緒。(3).當(dāng)共享狀態(tài)就緒后,則該函數(shù)將解除阻塞并void返回。
7. wait_for函數(shù):(1).等待共享狀態(tài)在指定的時(shí)間內(nèi)(time span)準(zhǔn)備就緒。(2). 如果共享狀態(tài)尚未就緒(即提供者尚未設(shè)置其值或異常),則該函數(shù)將阻塞調(diào)用的線程直到就緒或已達(dá)到設(shè)置的時(shí)間。(3).此函數(shù)的返回值類型為枚舉類future_status。此枚舉類有三種label:ready:共享狀態(tài)已就緒;timeout:在指定的時(shí)間內(nèi)未就緒;deferred:共享狀態(tài)包含了一個(gè)延遲函數(shù)(deferred function)。(4).如果共享狀態(tài)包含了一個(gè)延遲函數(shù),則該函數(shù)不會(huì)阻塞,立即返回一個(gè)future_status::deferred值。
8. wait_until函數(shù):(1). 等待共享狀態(tài)在指定的時(shí)間點(diǎn)(time point)準(zhǔn)備就緒。(2). 如果共享狀態(tài)尚未就緒(即提供者尚未設(shè)置其值或異常),則該函數(shù)將阻塞調(diào)用的線程直到就緒或已達(dá)到指定的時(shí)間點(diǎn)。(3).此函數(shù)的返回值類型為枚舉類future_status。(4).如果共享狀態(tài)包含了一個(gè)延遲函數(shù),則該函數(shù)不會(huì)阻塞,立即返回一個(gè)future_status::deferred值。
詳細(xì)用法見下面的測(cè)試代碼,下面是從其他文章中copy的測(cè)試代碼,詳細(xì)內(nèi)容介紹可以參考對(duì)應(yīng)的reference:
#include "future.hpp"
#include <iostream>
#include <future>
#include <chrono>
#include <utility>
#include <thread>namespace future_ {///
// reference: https://en.cppreference.com/w/cpp/thread/shared_future
int test_shared_future_1()
{std::promise<void> ready_promise, t1_ready_promise, t2_ready_promise;// 通過std::future移動(dòng)構(gòu)造std::shared_future對(duì)象,t1_ready_promise和t2_ready_promise均會(huì)用到ready_futurestd::shared_future<void> ready_future(ready_promise.get_future());std::chrono::time_point<std::chrono::high_resolution_clock> start;auto fun1 = [&, ready_future]() -> std::chrono::duration<double, std::milli> {t1_ready_promise.set_value();ready_future.wait(); // waits for the signal from main()return std::chrono::high_resolution_clock::now() - start;};auto fun2 = [&, ready_future]() -> std::chrono::duration<double, std::milli> {t2_ready_promise.set_value();ready_future.wait(); // waits for the signal from main()return std::chrono::high_resolution_clock::now() - start;};auto fut1 = t1_ready_promise.get_future();auto fut2 = t2_ready_promise.get_future();auto result1 = std::async(std::launch::async, fun1);auto result2 = std::async(std::launch::async, fun2);// wait for the threads to become readyfut1.wait();fut2.wait();// the threads are ready, start the clockstart = std::chrono::high_resolution_clock::now();// signal the threads to goready_promise.set_value();std::cout << "Thread 1 received the signal " << result1.get().count() << " ms after start\n"<< "Thread 2 received the signal " << result2.get().count() << " ms after start\n";return 0;
}///
// reference: https://en.cppreference.com/w/cpp/thread/shared_future/wait
int fib(int n)
{if (n < 3) return 1;else return fib(n - 1) + fib(n - 2);
}int test_shared_future_2()
{// 將std::shared_future<int>調(diào)整為std::future<int>也是正確的std::shared_future<int> f1 = std::async(std::launch::async, []() { return fib(20); });std::shared_future<int> f2 = std::async(std::launch::async, []() { return fib(25); });std::cout << "waiting...\n";f1.wait();f2.wait();std::cout << "f1: " << f1.get() << '\n';std::cout << "f2: " << f2.get() << '\n';return 0;
}///
// reference: https://en.cppreference.com/w/cpp/thread/shared_future/wait_for
int test_shared_future_3()
{// 將std::shared_future<int>調(diào)整為std::future<int>也是正確的std::shared_future<int> future = std::async(std::launch::async, [](){ std::this_thread::sleep_for(std::chrono::seconds(3));return 8; }); std::cout << "waiting...\n";std::future_status status;do {status = future.wait_for(std::chrono::seconds(1));if (status == std::future_status::deferred) {std::cout << "deferred\n";} else if (status == std::future_status::timeout) {std::cout << "timeout\n";} else if (status == std::future_status::ready) {std::cout << "ready!\n";}} while (status != std::future_status::ready); std::cout << "result is " << future.get() << '\n';return 0;
}} // namespace future_
GitHub:https://github.com/fengbingchun/Messy_Test
總結(jié)
以上是生活随笔為你收集整理的C++11中std::shared_future的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11中std::future的使用
- 下一篇: C++11中std::packaged_