C++ async 函數的使用


C++11中的std::async是個模板函數。std::async異步調用函數,在某個時候以Args作為參數(可變長參數)調用Fn,無需等待Fn執行完成就可返回,返回結果是個std::future對象。Fn返回的值可通過std::future對象的get成員函數獲取。一旦完成Fn的執行,共享狀態將包含Fn返回的值並ready。

std::async有兩個版本:

1.無需顯示指定啟動策略,自動選擇,因此啟動策略是不確定的,可能是std::launch::async,也可能是std::launch::deferred,或者是兩者的任意組合,取決於它們的系統和特定庫實現。

2.允許調用者選擇特定的啟動策略。

std::async的啟動策略類型是個枚舉類enum class launch,包括:

std::launch::async:異步,啟動一個新的線程調用Fn,該函數由新線程異步調用,並且將其返回值與共享狀態的訪問點同步。

std::launch::deferred:延遲,在訪問共享狀態時該函數才被調用。對Fn的調用將推遲到返回的std::future的共享狀態被訪問時(使用std::future的wait或get函數)。

參數Fn:可以為函數指針、成員指針、任何類型的可移動構造的函數對象(即類定義了operator()的對象)。Fn的返回值或異常存儲在共享狀態中以供異步的std::future對象檢索。

參數Args:傳遞給Fn調用的參數,它們的類型應是可移動構造的。

返回值:當Fn執行結束時,共享狀態的std::future對象准備就緒。std::future的成員函數get檢索的值是Fn返回的值。當啟動策略采用std::launch::async時,即使從不訪問其共享狀態,返回的std::future也會鏈接到被創建線程的末尾。在這種情況下,std::future的析構函數與Fn的返回同步。
=============================

 

 

future<T>提供了一種異步獲得線程中的函數返回值的方法 。future<T>表示一個類型為T的future值,這個值可以通過future<t>的get()函數來獲取。這個值在線程開始執行時還是不可用的,是一個“未來的期望值”。get()函數是同步的,從子線程獲取時阻塞當前線程,直到返回。

future<>可以被packaged_task<>和promise<>包裝。

packaged_task<>包含兩個基本的元素A  stored  task(即一個廣義的可調用對象)和A  shared  state, 是一個泛化的可調用對象的包裝器,類似於function<>,不過不能接受bind() 返回值。package_task<>包裝對象得到包裝對象,能夠通過包裝的對象的get_future() 方法返回一個future對象,借由future對象便可以異步得到調用被包裝的可調用對象的返回值。

於是,可以將packaged_task<>包裝的可調用對象,在另外一個線程來執行,最后通過future<>傳出在執行的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM