微軟已經在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的...