先用std::async啟動乙個非同步任務,它返回乙個持有計算結果的std::future,通過std::future::get即可阻塞執行緒,直到期值的狀態為ready並返回該結果
intf(
)int
main()
intf(
);// 函式必須非同步執行,即執行在不同的執行緒上
auto ft1 = std::
async
(std::launch::async, f)
;// 函式只在返回的期值呼叫get或wait時執行
auto ft2 = std::
async
(std::launch::deferred, f)
;// 不指定時的預設啟動策略是對兩者進行或運算的結果
// auto ft3 = std::async(f)等價於
auto ft3 = std::
async
(std::launch::async | std::launch::deferred, f)
;
packaged_task類模板也是定義於future標頭檔案中,它包裝任何可呼叫 (callable) 目標,包括函式、 lambda 表示式、 bind 表示式或其他函式物件,使得能非同步呼叫它,其返回值或所拋異常被儲存於能通過 std::future 物件訪問的共享狀態中。簡言之,將乙個普通的可呼叫函式物件轉換為非同步執行的任務。通過packaged_task包裝後,可以通過thread啟動或者仿函式形式啟動,其執行結果返回值或所拋異常被儲存於能通過 std::future 物件訪問的共享狀態中。
#include
// std::cout
#include
// std::thread
#include
#include
using
namespace std;
//普通函式
intadd
(int x,
int y)
void
task_lambda()
);//仿函式形式,啟動任務
task(2
,10);
//獲取共享狀態中的值,直到ready才能返回結果或者異常
future<
int> result = task.
get_future()
; cout <<
"task_lambda :"
<< result.
get(
)<<
"\n";}
void
task_thread()
intmain
(int argc,
char
*ar**)
乙個std::promise只能關聯乙個std::future,關聯多次時將丟擲std::future_error異常
std::promise<
int> ps;
std::future<
int> ft = ps.
get_future()
;ps.
set_value(42
);// set_value還會將狀態設定為就緒
std::cout << ft.
get();
// 42
void
f(std::promise<
void
> ps)
intmain()
//第一種
std::promise<
int> ps;
std::future<
int>
ft(ps.
get_future()
);std::shared_future<
int>
sf(std::
move
(ft));
//第二種
// std::future隱式轉換為std::shared_future
std::promise<
int> ps;
std::shared_future<
int>
sf(ps.
get_future()
);//第三種
std::promise<
int> ps;
auto sf = ps.
get_future()
.share()
;
1.
2.
C 11 多執行緒
新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...
c 11 多執行緒
1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...
C 11 多執行緒
2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...