C 非同步程式設計 for VS2011(三)

2022-07-05 16:06:11 字數 2538 閱讀 1055

任務組:

在之前我們介紹的非同步操作都是基於task<>的,這個是被封裝好的類,可以作為傳入,或者傳出引數。下面我們要介紹的任務組的概念,他是比task<>更輕量級的非同步呼叫方式。

在ppl中concurrency::task_group和concurrency::structured_task_group,這兩個類都是非同步操作的任務組,concurrency::task_handle類是任務組的基本單位。

我們先用 concurrency::structured_task_group舉例,我們通過structured_task_group::run 去新增任務,這個任務就是 concurrency::task_handle,他的構造函式引數可以是函式指標,結構體重載()操作符,或者是lambda表示式。我們通過structured_task_group::wait去執行已經新增的任務,或者通過structured_task_group::run_and_wait去新增並執行所有的任務

#include "

stdafx.h

"#include 

#include 

#include 

using

namespace concurrency;

using

namespace std;

const

struct functionstruct);

//create a child task.

auto t5 = make_task([&] );

//run the child tasks and wait for them to finish.

tg2.run(t4);

tg2.run(t5);

tg2.wait();

});//

create a child task.

auto t2 = make_task([&] );

//create a child task.

auto t3 = make_task([&] );

//run the child tasks and wait for them to finish.

tg1.run(t1);

tg1.run(t2);

tg1.run(t3);

tg1.wait();   

我們可以通過structured_task_group::cancel 在內部或者外部來取消整個任務組,通過structured_task_group::is_canceling 來得到取消狀態。

對於異常我們要在.wait()方法外面加try_catch

structured_task_group tg2;

//create a child task.      

auto t4 = make_task([&] 

}         

});//

create a child task.

auto t5 = make_task([&] );

//run the child tasks.

tg2.run(t4);

tg2.run(t5);

//wait for the tasks to finish. the runtime marshals any exception

//that occurs to the call to wait.

trycatch (const exception& e)

{wcout << e.what() << endl;

上面說完了  concurrency::structured_task_group,concurrency::task_group 的使用方法基本上和前者類似。但是後者比前者更靈活,同樣消耗的資源也更多。

下面是他們兩個之間不同的地方。 

1. task_group是執行緒安全的,可以在別的執行緒裡面通過run新增task, structured_task_group不允許多執行緒操作,而且所有的操作必須寫在乙個執行緒**塊裡。

2.  task_group可以再wait()方法執行之後,再通過run 方法新增task,而structured_task_group是固定的,.wait()後不能再新增。

3. structured_task_group 建立的任務組樹,子節點必須在父節點裡面呼叫wait()的方法,因為structured_task_group只能在乙個執行緒**塊裡面執行,所以子節點必須要呼叫wait(),而task_group不需要。

4.task_group 新增任務不需要呼叫make_task()方法, structured_task_group 必須呼叫。

task_group tasks;

tasks.run(&taskfuncton);

tasks.run(myfunction);

tasks.run_and_wait( { cout<<"

this is lambed express

"《總之, task_group較之structured_task_group又多封裝了很多東西,如果沒有特殊需要structured_task_group可以寫出更高效的**。

引用自:

C 非同步程式設計 for VS2011(一)

微軟已經在vs10中加入了concurrency runtime namespace來支援c 的非同步程式設計,筆者認為非同步程式設計在是現代程式語言的乙個發展方向。在此總結一些非同步程式設計的基本概念和語法,希望能給大家理解非同步程式設計帶來一些方便。task是乙個模板類,t是函式返回值的型別,比...

非同步程式設計 三

4.c 4.x task的新特性 async await 這種程式設計方式是對之前task的補充和擴充套件,簡化了非同步程式設計,讓喜歡用同步程式設計的同學,使用起來更順手 static void main thread.currentthread.managedthreadid program p...

C 非同步程式設計

同步方法和非同步方法的區別 同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果 非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作 非同步程式設計概覽 net framework 允許您非同步呼叫任何方法。定義與您需要呼叫的方法具有相同簽名的委託 公共語言執...