並行開發基礎

2022-01-11 03:56:34 字數 1398 閱讀 5661

並行開發適合用於分解計算密集型的任務片段,並將它們分配給多個執行緒。

有一批資料,需要對每個元素進行相同的操作。該操作是計算密集型,需要耗費一定的時間。parallel型別的 foreach 方法就是專門為此設計的。

parallel的foreach可以對一系列值進行並行處理。還有類似的解決方案,就是plinq(並行linq)。

parallel和plinq的區別:plinq假設可以使用計算機的所以cpu核,而parallel會根據cpu的狀態進行動態調整。

parallel的foreach是並行版本的foreach版本。parallel類也提供了並行版本的for迴圈parallel.for。如果有多個陣列的資料,並且採用了相同的索引,parallel.for方法就比較適合。

在並行操作結束時,需要集合結果,包括累加和、平均值等。

在parallel中可以使用加鎖的方法,來進行聚合。 

plinq中聚合的支援,比parallel類使用更順手。

private

static

int parallelsum(ienumerablevalues)

需要並行呼叫一批方法,並且這些方法(大部分)是互相獨立的。 parallel.invoke方法就是用於這種場合。

例如並行呼叫乙個方法10次:

private

static

void

doaction10count(action action)

對於簡單的並行呼叫, parallel.invoke是乙個不錯的方式。但是,對於每乙個輸入都要呼叫乙個操作,改用parallel.foreach,或者每乙個操作要產生乙個輸出,改用plinq可能更好。

並行任務的結構和數量要在執行時才能確定,這是一種更複雜的並行程式設計。

任務並行庫(tpl)是以task類為中心構建的。parallel和plinq都是為了使用方便,對task類的封裝。

實現動態並行最簡單的做法就是直接使用 task 類。

在並行中是用task和在非同步中使用task完全不同:

並行:並行任務可以使用阻塞的成員函式。例如:task.waitall,task.wait,taks.result,taks.waitany。並行任務通常也使用attachedtoparent來建立任務之間的父/子關係。

並行任務的建立需要使用task.run或者task.factory.startnew方法。

非同步:非同步任務應該避免使用阻塞的成員函式。而應該使用await,task.whenall、taks.whenany。

需要對一批資料進行處理,生成另外一批資料,或者對資料進行統計。

plinq為各種操作提供了並行操作,包括過濾、投影、聚合等。

plinq適合於對資料流進行操作,乙個資料佇列做為輸入,乙個資料佇列做為輸出。

多核並行開發

在科學與工程計算 大型資料庫 監控中心等領域,效能需求高於程式設計代價,早在單核 時代,就已經廣泛採用單主機上的多cpu,乃至多主機集群的結構,自然也很早就開始使 用並行程式 有單程序多執行緒的並行,有單機多程序的並行,還有多機多程序的並行。即使是使用多主機集群 cluster 結構的場合,往往也歡...

C 之並行開發

並行開發 加速遊戲 處理器製造商有用他們的cpu在每秒。這看起來是模型cpu在桌面電腦,台式以及手機,cpu將要超過2.5ghz。cpu將要有yue來yue多的表現。在本章我們將要展示如何創造乙個執行緒來執行這個方法game rungame.這將要意味著主要的遊戲迴圈將要執行在它自己本身的執行執行緒...

底層開發與並行程式設計

herb sutter 微軟c cli語言主設計師,預言 底層程式設計將再度流行 因為,晶元製造商發現他們無法保持現有的處理器效能增長速度.我想我們可能還剩5到10年時間 因為摩爾定律 他說,效能優化將再度變得非常,非常流行,那時人們將認識到抽象的代價 同時 sutter說,程式設計師將為並行的,多...