c 並行和多執行緒程式設計 認識Parallel

2021-10-19 14:41:16 字數 2607 閱讀 1467

隨著多核時代的到來,並行開發越來越展示出它的強大威力!使用並行程式,充分的利用系統資源,提高程式的效能。在.net 4.0中,微軟給我們提供了乙個新的命名空間:system.threading.tasks。這裡面有很多關於並行開發的東西,今天第一篇就介紹下最基礎,最簡單的——認識和使用parallel。

一、 parallel的使用

在parallel下面有三個常用的方法invoke,for和foreach。

1、parallel.invoke

這是最簡單,最簡潔的將序列的**並行化。

在這裡先講乙個知識點,就是stopwatch的使用,最近有一些人說找不到stopwatch,stopwatch到底是什麼東西,今天就來說明一下。

stopwatch在system.diagnostics命名控制項,要使用它就要先引用這個命名空間。

其使用方法如下:

下面進入整體,開始介紹parallel.invoke方法,廢話不多說了,首先新建乙個控制台程式,新增乙個類,**如下:12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

29public class paralleldemo

public void run2()

public void parallelinvokemethod()

}**很簡單,首先新加乙個類,在類中寫了兩個方法,run1和run2,分別等待一定時間,輸出一條資訊,然後寫了乙個測試方法parallelinvokemethod,分別用兩種方法呼叫run1和run2,然後在main方法中呼叫,下面來看一下執行時間如何:

大家應該能夠猜到,正常呼叫的話應該是5秒多,而parallel.invoke方法呼叫用了只有3秒,也就是耗時最長的那個方法,可以看出方法是並行執行的,執行效率提高了很多。

2、parallel.for

這個方法和for迴圈的功能相似,下面就在類中新增乙個方法來測試一下吧。**如下:12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

public void parallelformethod()

}stopwatch.stop();

console.writeline("normalfor run " + stopwatch.elapsedmilliseconds + " ms.");

stopwatch.reset();

stopwatch.start();

parallel.for(0, 10000, item =>

});stopwatch.stop();

console.writeline("parallelfor run " + stopwatch.elapsedmilliseconds + " ms.");

}寫了兩個迴圈,做了一些沒有意義的事情,目的主要是為了消耗cpu時間,同理在main方法中呼叫,執行結果如下圖:

可以看到,parallel.for所用的時間比單純的for快了1秒多,可見提公升的效能是非常可觀的。那麼,是不是parallel.for在任何時候都比for要快呢?答案當然是「不是」,要不然微軟還留著for幹嘛?

下面修改一下**,新增乙個全域性變數num,**如下:12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

37public void parallelformethod()

}stopwatch.stop();

console.writeline("normalfor run " + stopwatch.elapsedmilliseconds + " ms.");

stopwatch.reset();

stopwatch.start();

parallel.for(0, 10000, item =>

}});

stopwatch.stop();

console.writeline("parallelfor run " + stopwatch.elapsedmilliseconds + " ms.");

}parallel.for由於是並行執行的,所以會同時訪問全域性變數num,為了得到正確的結果,要使用lock,此時來看看執行結果:

是不是大吃一驚啊?parallel.for竟然用了15秒多,而for跟之前的差不多。這主要是由於並行同時訪問全域性變數,會出現資源爭奪,大多數時間消耗在了資源等待上面。

一直說並行,那麼從**可以看出來parallel.for是並行執行的呢?下面來寫個測試**:12

34parallel.for(0, 100, i =>

);從0輸出到99,執行後會發現輸出的順序不對,用for順序肯定是對的,並行同時執行,所以會出現輸出順序不同的情況。

c 並行和多執行緒程式設計 認識Parallel

隨著多核時代的到來,並行開發越來越展示出它的強大威力!使用並行程式,充分的利用系統資源,提高程式的效能。在.net 4.0中,微軟給我們提供了乙個新的命名空間 system.threading.tasks。這裡面有很多關於並行開發的東西,今天第一篇就介紹下最基礎,最簡單的 認識和使用parallel...

C 並行和多執行緒程式設計四 Task高階

一 task的巢狀task中還可以再巢狀task,thread中能不能這樣做,我只能說我是沒這樣寫過。task中的巢狀,我感覺其實也可以分開來寫,不過巢狀起來會方便管理一點。task中的巢狀分為兩種,關聯巢狀和非關聯巢狀,就是說內層的task和外層的task是否有聯絡,下面我們編寫 先來看一下非關聯...

Python 並行程式設計 多執行緒

最近看了一下 python並行程式設計手冊 雖然這本書薄薄的,包含內容挺多,但是有很多地方講的不清楚,而且有一些bug出現,講道理不推薦看這本書,但是我也隨手翻完了,也寫著玩,總結一下python並行程式設計,順便寫一寫書裡有問題的地方。這本書的問題過多,不建議閱讀!尤其是mpi4py之後的內容。棄...