C 併發指南 std async

2021-10-22 06:45:31 字數 1758 閱讀 3735

首先,來看下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框架,做每件事情都變得便捷起來 從設計開發新應用到不用大刀闊斧地修改 就能為現有 提供新的特性和功能。關於本書 市面上已經有了一些講解...