首先,來看下std::async函式的原型:
template
<
classfn,
class..
. args>
future<
typename result_of<
fn(args...
)>
::type>
async
(launch policy, fn&& fn, args&&..
.args)
;
可以看出,async有三個引數,其中第乙個引數用於設定資料互動方式,第二個引數是乙個可呼叫的物件(仿函式、lambda表示式、類成員函式、普通函式…),第三個引數是第二個引數的函式引數。
資料互動方式是同步還是非同步,由第乙個引數決定:
std::launch::async 傳遞的可呼叫物件非同步執行;
std::launch::deferred 傳遞的可呼叫物件同步執行;
std::launch::async | std::launch::deferred 可以非同步或是同步,取決於作業系統,我們無法控制;
如果我們不指定策略,則相當於(3)。
對於執行結果,我們可以使用get、wait、wait_for、wait_until等待執行結束,區別是get可以獲得執行的結果。如果選擇非同步執行策略,呼叫get時,如果非同步執行沒有結束,get會阻塞當前呼叫執行緒,直到非同步執行結束並獲得結果,如果非同步執行已經結束,不等待獲取執行結果;如果選擇同步執行策略,只有當呼叫get函式時,同步呼叫才真正執行,這也被稱為函式呼叫被延遲。
返回結果std::future的狀態:
deffered:非同步操作還沒有開始;
ready:非同步操作已經完成;
timeout:非同步操作超時。 例1
#include
#include
#include
#include
#include
using
namespace std::chrono;
std::string fetchdatafromdb
(std::string recvdata)
std::string fetchdatafromfile
(std::string recvdata)
intmain()
例2
#include
#include
#include
#include
#include
using
namespace std::chrono;
std::string fetchdatafromdb
(std::string recvdata)
intmain()
}while
(status != std::future_status::ready)
;//獲取結束時間
auto end = system_clock::
now();
auto diff = duration_cast
(end - start)
.count()
; std::cout <<
"total time taken = "
<< diff <<
" seconds. "
<< std::endl;
return0;
}
C 11 併發指南 筆記
參考書籍 c concurrency in action 前四章 介紹了庫提供的各種多執行緒工具 第五章 涵蓋了記憶體模型以及原子操作的底層細節,譬如原子怎麼用來在其它 上強加上順序限制 第六章和第七章 開始討論高層級的話題,譬如怎樣用一些基礎工具構建複雜的資料結構 基於鎖的資料結構,在第六章闡述,...
C 11 併發指南系列
本系列文章主要介紹 c 11 併發程式設計,計畫分為 9 章介紹 c 11 的併發和多執行緒程式設計,分別如下 c 11 併發指南一 c 11 多執行緒初探 本章計畫 1 2 篇,已完成 1 篇 c 11 併發指南二 std thread 詳解 本章計畫 1 2 篇,已完成 1 篇 c 11 併發指...
Django Web開發指南
國內第一本django圖書 django web開發指南 歡迎使用django 歡迎來到django的世界,很高興能和你一起進行這趟旅程。你會發現有了這個強大的web框架,做每件事情都變得便捷起來 從設計開發新應用到不用大刀闊斧地修改 就能為現有 提供新的特性和功能。關於本書 市面上已經有了一些講解...