日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微软并行编程类库Parallel Extensions初探 Part1

發布時間:2024/4/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微软并行编程类库Parallel Extensions初探 Part1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

Microsoft Parallel Extensions to the .NET Framework 3.5是一個托管編程模型,用于數據并行化和任務并行化,并可對統一在共同的工作調度程序之下的并行硬件進行協調。 Parallel Extensions to the .NET Framework 3.5使開發者更容易編寫出充分發揮并行硬件的優勢的程序,不但能隨著處理器數量的增長而提高性能,而且避免了許多舊有并發編程模型的復雜性。

你可以從這里下載Microsoft Parallel Extensions to the .NET Framework 3.5 June 2008 CTP版本,安裝后會注冊一個System.Threading.dll程序集到GAC中。Parallel Extensions主要由兩部分組成:Task Parallel Library(TPL)和Parallel LINQ (PLINQ),它們將會集成在.NET Framework 4.0中。

簡單調用

在開始之前,我們不妨停下來思考幾個問題:如果有多個線程在同一時間訪問同一個變量,它們之間可能會互相影響,該如何解決?如果有多個線程同時鎖住了一些資源,由于互相等待而造成死鎖,該如何解決?如果覺的這些問題很難解決,那就不要思考了,有了Parallel.Invoke,無需再去考慮這些令人頭疼的問題,我們先定義三個任務:

private void Task1() {Thread.Sleep(1000); } private void Task2() {Thread.Sleep(2000); } private void Task3() {Thread.Sleep(3000); }

并行調用這三個任務,只需要一句話:

Parallel.Invoke(Task1, Task2, Task3);

除此之外,還可以把所有的任務放在一個Action數據組中,再進行調用,如下代碼片段,這在某些場景中會非常的有用,我們在設計階段無需考慮最終運行時將會有多少個任務會執行:

Action[] actions = { Task1, Task2, Task3 }; Parallel.Invoke(actions);

我們不妨對Parallel.Invoke做一個簡單的測試,如下代碼片段所示:

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; }

來看看最后的結果:

??

循環調用

循環執行某件事情應該是我們編程中經常遇到的問題,但是之前所有的循環只能順序的進行執行,如下面這段代碼,再平常不過了:

for (int i = 0; i < 10; i++) {Compute(i); }

在Parallel Extensions中,可以使用Parallel.For來并行的執行循環任務:

Parallel.For(0, 10,delegate (int i){Compute(i);});

甚至有了Lambda表達式,還可以更簡單的編寫為:

Parallel.For(0, 10,i => { Compute(i);});

現在,我們再來做一個簡單的測試,代碼如下:

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); }

測試結果如下:

類似的在Parallel中還提供了Parallel.ForEach方法,如下圖所示:

?

我們使用類似于如下的代碼來使用該方法:

List<int> data = new List<int> { 1, 2, 3, 4, 5 }; Parallel.ForEach(data,i => { Compute(i); });

總結

以上簡單的介紹了Task Parallel Library中的Parallel, 希望對大家有所幫助

轉載于:https://www.cnblogs.com/liufei88866/archive/2013/06/13/3133641.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的微软并行编程类库Parallel Extensions初探 Part1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。