C 多執行緒非同步 std async

2021-10-20 20:12:39 字數 2065 閱讀 7200

c++11中的std::async是個模板函式。std::async非同步呼叫函式,在某個時候以args作為引數(可變長引數)呼叫fn,無需等待函式執行完成就可返回,返回結果是個std::future物件。函式返回的值可通過std::future物件的get成員函式獲取。一旦完成函式的執行,共享狀態將包含函式返回的值並ready。

允許呼叫者選擇特定的啟動策略,第乙個引數是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呼叫的引數,它們的型別應是可移動構造的。

std::launch::async:非同步

#include

#include

#include

#include

#include

using

namespace std::chrono;

std::string getdata()

void

breakcode()

intmain()

結果

std::launch::deferred:延遲

#include

#include

#include

#include

#include

using

namespace std::chrono;

std::string getdata()

void

breakcode()

intmain()

結果

第乙個引數如果不寫,自動選擇,因此啟動策略是不確定的,可能是std::launch::async,也可能是std::launch::deferred,或者是兩者的任意組合,取決於它們的系統和特定庫實現。vs是std::launch::deferred

lamda函式,第乙個引數如果不寫

#include

#include

#include

#include

#include

using

namespace std::chrono;

intmain()

);()()

;//資料在future物件中可獲取之前,將一直阻塞

std::string strdata = strfusec.

get();

//獲取結束時間

auto end = system_clock::

now();

auto diff = duration_cast<:chrono::seconds>

(end - start)

.count()

; std::cout <<

"用時"

<< diff <<

"秒"<< std::endl;

std::cout << strdata << std::endl;

return0;

}

結果

C 11多執行緒 std async

std async可以認為是封裝了乙個std promise,該函式返回乙個std future,用於獲取其他執行緒的資料。該函式的本質是內部封裝構造了乙個執行緒,然後傳遞給乙個std promise,之後返回乙個對應的std future。如果不是執行緒池,而僅僅是非同步呼叫,那麼非常推薦使用該模...

c 非同步多執行緒

1.asyncrel delegate.begininvoke實現委託非同步呼叫。2.非同步等待 asyncrel.iscompleted用於判斷是否執行完畢 or endinvoke用於等待執行完。3.非同步多執行緒 資源換時間 使用場景 1.任務比較多,需要提高效率,資源換時間 2.推遲執行,比...

c 非同步 多執行緒

c 到了現在6.0時代對於非同步多執行緒也出了不少的類,從最開始thread到threadpool 到後面的task 到現在async await 也經歷了不少版本。今天乙個乙個來聊聊。首先我們要明確非同步和多執行緒不是乙個概念,非同步指向的是執行的邏輯順序不是同步的。了解了非同步多執行緒的理念後那...