微软并行编程类库Parallel Extensions初探 Part1
概述
Microsoft Parallel Extensions to the .NET Framework 3.5是一個(gè)托管編程模型,用于數(shù)據(jù)并行化和任務(wù)并行化,并可對(duì)統(tǒng)一在共同的工作調(diào)度程序之下的并行硬件進(jìn)行協(xié)調(diào)。 Parallel Extensions to the .NET Framework 3.5使開(kāi)發(fā)者更容易編寫(xiě)出充分發(fā)揮并行硬件的優(yōu)勢(shì)的程序,不但能隨著處理器數(shù)量的增長(zhǎng)而提高性能,而且避免了許多舊有并發(fā)編程模型的復(fù)雜性。
你可以從這里下載Microsoft Parallel Extensions to the .NET Framework 3.5 June 2008 CTP版本,安裝后會(huì)注冊(cè)一個(gè)System.Threading.dll程序集到GAC中。Parallel Extensions主要由兩部分組成:Task Parallel Library(TPL)和Parallel LINQ (PLINQ),它們將會(huì)集成在.NET Framework 4.0中。
簡(jiǎn)單調(diào)用
在開(kāi)始之前,我們不妨停下來(lái)思考幾個(gè)問(wèn)題:如果有多個(gè)線程在同一時(shí)間訪問(wèn)同一個(gè)變量,它們之間可能會(huì)互相影響,該如何解決?如果有多個(gè)線程同時(shí)鎖住了一些資源,由于互相等待而造成死鎖,該如何解決?如果覺(jué)的這些問(wèn)題很難解決,那就不要思考了,有了Parallel.Invoke,無(wú)需再去考慮這些令人頭疼的問(wèn)題,我們先定義三個(gè)任務(wù):
private void Task1() {Thread.Sleep(1000); } private void Task2() {Thread.Sleep(2000); } private void Task3() {Thread.Sleep(3000); }并行調(diào)用這三個(gè)任務(wù),只需要一句話:
Parallel.Invoke(Task1, Task2, Task3);除此之外,還可以把所有的任務(wù)放在一個(gè)Action數(shù)據(jù)組中,再進(jìn)行調(diào)用,如下代碼片段,這在某些場(chǎng)景中會(huì)非常的有用,我們?cè)谠O(shè)計(jì)階段無(wú)需考慮最終運(yùn)行時(shí)將會(huì)有多少個(gè)任務(wù)會(huì)執(zhí)行:
Action[] actions = { Task1, Task2, Task3 }; Parallel.Invoke(actions);我們不妨對(duì)Parallel.Invoke做一個(gè)簡(jiǎn)單的測(cè)試,如下代碼片段所示:
private long InvokeSequential() {Stopwatch watch = new Stopwatch();watch.Start();Task1();Task2();Task3();watch.Stop();return watch.ElapsedMilliseconds; }private long InvokeParallel() {Stopwatch watch = new Stopwatch();watch.Start();Parallel.Invoke(Task1, Task2, Task3);watch.Stop();return watch.ElapsedMilliseconds; }private long InvokeParallelArray() {Stopwatch watch = new Stopwatch();watch.Start();Action[] actions = { Task1, Task2, Task3 };Parallel.Invoke(actions);watch.Stop();return watch.ElapsedMilliseconds; }來(lái)看看最后的結(jié)果:
??
循環(huán)調(diào)用
循環(huán)執(zhí)行某件事情應(yīng)該是我們編程中經(jīng)常遇到的問(wèn)題,但是之前所有的循環(huán)只能順序的進(jìn)行執(zhí)行,如下面這段代碼,再平常不過(guò)了:
for (int i = 0; i < 10; i++) {Compute(i); }在Parallel Extensions中,可以使用Parallel.For來(lái)并行的執(zhí)行循環(huán)任務(wù):
Parallel.For(0, 10,delegate (int i){Compute(i);});甚至有了Lambda表達(dá)式,還可以更簡(jiǎn)單的編寫(xiě)為:
Parallel.For(0, 10,i => { Compute(i);});現(xiàn)在,我們?cè)賮?lái)做一個(gè)簡(jiǎn)單的測(cè)試,代碼如下:
private static long SequentialForLoop() {Stopwatch watch = new Stopwatch();watch.Start();for (int i = 0; i < 10; i++){Compute(i);} watch.Stop();return watch.ElapsedMilliseconds; }private static long ParallelForLoop() {Stopwatch watch = new Stopwatch();watch.Start();Parallel.For(0, 10,i => { Compute(i);});watch.Stop();return watch.ElapsedMilliseconds; }private static void Compute(int i) {Thread.Sleep(200 * i); }測(cè)試結(jié)果如下:
類似的在Parallel中還提供了Parallel.ForEach方法,如下圖所示:
?
我們使用類似于如下的代碼來(lái)使用該方法:
List<int> data = new List<int> { 1, 2, 3, 4, 5 }; Parallel.ForEach(data,i => { Compute(i); });總結(jié)
以上簡(jiǎn)單的介紹了Task Parallel Library中的Parallel, 希望對(duì)大家有所幫助
轉(zhuǎn)載于:https://www.cnblogs.com/liufei88866/archive/2013/06/13/3133641.html
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的微软并行编程类库Parallel Extensions初探 Part1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++求数组子数组和的最大值并将该子数组
- 下一篇: CentOS编译安装php扩展gd