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

2022-07-05 16:12:07 字數 2168 閱讀 5331

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

task是乙個模板類,t是函式返回值的型別,比如taskt(()),或者函式返回值為空taskt(())。task的建構函式傳入引數可以是lambda表示式。我們宣告了乙個task之後,通過呼叫wait()方法去執行他,對於有返回值的task,我們呼叫.get()方法去取得他的返回值。下面是乙個簡單的例子

#include 

#include 

using

namespace concurrency;

using

namespace std;

int wmain()

);t.wait();

wcout << t.get() << endl;

}我們可以用.then()的方法去指定乙個連續的任務,就是在前乙個task完成之後立刻執行.then()裡面的函式。這個函式要求接受前乙個任務返回的結果。比如前乙個任務中函式返回的是int 那麼在.then()的函式裡面就要指定傳入引數為int的lambda表示式()[int res]。.then()方法只要求傳入引數和上乙個任務相同,而返回值可以不同。比如下面的**,第乙個task返回int,在第乙個then中返回void,然後返回int,最後返回void。這裡要注意的是,在最後乙個then()中呼叫wait,而不是t.wait(),否則第乙個.then 不會執行。

task t(() );

t.then((int res)).then(()).then((int res));

});一組task的執行,我們可以把一組task放入到容器裡,然後通過when_all(),這個函式去執行他們,when_all傳入引數是容器迭代器的開始和結束。這裡要求容器裡面的task的返回值必須相同。這是沒有返回值的例子

//start multiple tasks.

arrayvoid>, 3> tasks = ),

task( ),

task( )

};auto jointask = when_all(tasks.begin(), tasks.end());

//print a message from the joining thread.

wcout << "

hello from the joining thread.

"<< endl;

//wait for the tasks to finish.

jointask.wait();

這是有返回值的例子,注意when_all().then 的傳入引數是vector

//start multiple tasks.

arrayint>, 3> tasks = ),

task( ),

task( )

};auto jointask = when_all(tasks.begin(), tasks.end())

.then((vector results)

);//

print a message from the joining thread.

wcout << "

hello from the joining thread.

"<< endl;

//wait for the tasks to finish.

jointask.wait();

when_all().wait()是當容器裡面所有的task都被執行後,才繼續向下執行。而when_any().wait()就是當容器裡第乙個task完成之後,就繼續向下執行。和when_all 一樣,when_any 要求task的返回值相同 。但是,when_any().then()的傳入引數是pairpair.first 是task的返回值,pair.second是已經完成的task的序號。

//start multiple tasks.

arrayint>, 3> tasks = ),

task( ),

task( )

};//

select the first to finish.

when_any(tasks.begin(), tasks.end())

.then((pair result)

).wait();   

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

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

C 非同步程式設計(一)

概要 這裡記錄一下初始學習非同步程式設計。首先理解非同步這個操作 舉個例子來說吧。我們每個人可以做 很多事情 這裡用 事情一,事情二,事情三 我們自己如果需要完成這三件事情的話,那麼 基本上來說是要有順序的一件一件的完成,也就是 一心不能二用 的道理。那麼如果我們想提高 效率,快速的完成這三件事情呢...

c 非同步程式設計 Task(一)

thread執行緒是用來建立併發的一種低級別工具,它具有一些限制,尤其是 task類可以很好的解決上述問題,它是乙個高階抽象 它代表了乙個併發操作 concurrent 該操作可能有thread支援,或不由thread支援。開始乙個task最簡單的辦法就是使用task.run net4.5,4.0的...