C 多執行緒七之Parallel

2021-09-08 05:32:13 字數 3700 閱讀 2743

1、簡介

關於parallel不想說太多,因為它是task的語法糖,至少我是這麼理解的,官方文件也是這麼說的,它本身就是基本task的.假設我們有乙個集合,不管是什麼集合,我們要遍歷它,首先想到的是for(如何涉及到修改或者讀可以用for)或者foreach(如果單純的讀),但是它兩是同步的去操作集合,但是使用parallel的靜態for或者foreach那就可以讓多個執行緒參與這個工作,這樣就能充分的利用cpu,但是你需要考慮cpu上下文產生的效能消耗,以及parallel本身的效能消耗,所以,這也能解釋為什麼,你的迴圈裡面執行的是不耗時的操作,使用for或者foreach的速度比使用parallel的要快,所以使用parallel還是要慎重.而且使用parallel還需要注意的一點就是,不能有多執行緒爭用問題,就是你的迴圈體裡面不能有操作靜態資源的操作.如果真的需要,那你可以加鎖,但是那就失去它的優勢了.

2、使用注意點

(1)、不能操作共享資源,**如下:

static

int sharedata = 10

;

static

void main(string

args)

static

void add(int

i)

**邏輯很簡單,1+2+3+......+100000這個過程中每次都加乙個10,怎麼說都是正數,但是,信不信它能給你加出個負數來(可能是記憶體溢位了),而且每次的結果都不一樣(重要)!自己試試吧!

解決方案很簡單,加個鎖,**如下:

class

parallerstudy

static

void add(int

i) }}

這個肯定是正確的值,因為每次的輸出都是這個,這裡因為如果給迴圈的最終值設小的話,他好像是同步去做了,不會有問題,所以這裡給了個100000,這個時候它會開多個執行緒去做.

(2)、它可以向task一樣丟擲異常,都是aggregateexception,**如下:

這裡就給截圖了,不寫**了.

(3)、效能開銷

這個不用多說,它是基於task,開銷還是有的,如果不清楚,去看我前面的文章

(4)、支援取消

(4)、可以設定最多的執行緒數 

實戰中有演示

(5)、排程器

這裡就不介紹了,後續的隨筆中會介紹

(6)、三個重要的委託

實戰中有演示 

3、實戰

(1)、下面寫個使用parallel多執行緒去讀檔案的例子

**如下:

class

parallerstudy

目錄下所有的檔案長度總和為:

", targetpath, totallength);

console.readkey();

}//////

多執行緒讀取多個檔案的內容

/// ///

///static

long dictionaryfilescontent(string path, string

searchpattern, searchoption searchoptions)

", thread.currentthread.managedthreadid);

return0;

},//主體委託,開始幹正事

(file, loopstate, index, tasklocalcount) =>,當前檔名為

", index, thread.currentthread.managedthreadid, fs.name);

}catch (ioexception) //

排除拒絕訪問的檔案

finally

return tasklocalcount +filelength;

},//終結委託,一般用於彙總主體委託的結果值,所以如果這裡涉及訪問共享資源的話,一般會用同步構造,也就是加鎖等操作

看這個例子前,還在想真的有這麼厲害嗎?其實也就那樣,根據輸出可以發現,乙個開了3個執行緒,去讀10個檔案,我還在想這裡面會不會有多執行緒爭用問題,但是沒有,你看它怎麼做的,每個執行緒只會去讀乙個檔案,讀的快的,立即去讀另外的檔案,我執行了n次,發現並沒有乙個檔案多個執行緒讀的問題,所以每個執行緒只會去讀乙個檔案,自然就不會有多執行緒爭用問題了.

(2)、關於parallelloopstate的用法

stop()和break方法最常用,當子任務處理批量的任務時,如果滿足某種條件,則告訴其餘的任務不需要在處理了.

這個物件主要用於parallel開啟的子任務群,它們內部之間的交流,**如下:

static

void main(string

args)

目錄下所有的檔案長度總和為:

", targetpath, totallength);

console.readkey();

}//////

多執行緒讀取多個檔案的內容

/// ///

///static

long dictionaryfilescontent(string path, string

searchpattern, searchoption searchoptions)

", thread.currentthread.managedthreadid);

return0;

},//主體委託,開始幹正事

(file, loopstate, index, tasklocalcount) =>

fs =file.openread(file);

filelength =fs.length;

console.writeline(

"當前執行緒id為,當前檔名為

", index, thread.currentthread.managedthreadid, fs.name);

}catch (ioexception) //

排除拒絕訪問的檔案

finally

return tasklocalcount +filelength;

},//終結委託,一般用於彙總主體委託的結果值,所以如果這裡涉及訪問共享資源的話,一般會用同步構造,也就是加鎖等操作

還有其它的一些用法,這裡就不介紹了,api裡面都有介紹.

(3)、parallel的返回值

就說乙個lowestbreakiteration,如果這個返回值為null,說明子任務群有個呼叫了stop方法,如果不為null,說明有個呼叫了break方法且值為呼叫break任務對應的index值.

C 多執行緒 parallel 類研究

parallel類提供資料和任務的並行性 paraller.for 方法 類似於c 的for迴圈語句,也是多次執行乙個任務。使用paraller.for 可以並行執行迭代,但迭代的順序是打亂的。paraller.for int,int,action 引數1為迴圈的開頭,引數2為迴圈的結束 引數三是個...

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

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

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

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