5

最近我已經閱讀了很多關於.NET平行編程的內容,但我仍然對這個主題上的文章發表了矛盾的說法。.NET在開發多線程應用程序和並行編程之間有什麼區別?

例如,彈出t工廠(在指向上的標籤的圖標鼠標)的stackoverflow.com task-parallel-library tag的描述:

「的任務並行庫是.NET 4部分是一組API TPO 使開發人員能夠編程多核共享存儲器的處理器」

這是否意味着多核-d和並行不可能編程應用使用.NET的先前版本?

我是否控制.NET多線程應用程序內核之間的多核/並行使用/分配?

如何識別一個要運行的線程並將線程歸於特定內核的內核?

啓用.NET 4.0+ Task Parallel Library的功能在以前的.NET版本中是不可能的?

更新:
嗯,這是很難制定具體的問題,但我想更好地瞭解:

是什麼開發多線程應用程序和並行編程之間.NET中的差異?

到目前爲止,我無法把握它們之間的區別

UPDATE2:
MSDN從版本.NET 4.0 "Parallel Programming in the .NET Framework"開始和它的文章Task Parallel Library講述:

「與.NET開始框架4,TPL是 編寫多線程和並行代碼的首選方式「

你能否給我提示如何在.NET4之前(在.NET3.5中)專門創建並行代碼,考慮到我熟悉多線程開發?

+2

我不會說'不可能'但'不實施'! – 2013-03-11 05:25:39

+4

這是一個問題,太多的問題。 – 2013-03-11 05:52:04

+1

@Eric Lippert,我試着開始產生新的問題,但我擔心它們會被重複關閉,因爲它們都是基本問題:「.NET中並行編程和多線程開發之間的區別是什麼? 「 – Fulproof 2013-03-11 06:06:36

回答

10

我看到「多線程」就像這個術語所說的那樣:使用多線程。

「並行處理」將是:在多個線程之間分割一組工作,以便可以並行處理工作。

因此,並行處理是多線程的特例。


這是否意味着多核-d和並行編程不可能應用程序中使用.NET之前的版本?

不是。你可以使用Thread這個課程。這很難寫,很多很難得到它。

我是否在.NET多線程應用程序中控制核心之間的多核/並行使用/分配?

不是真的,但你不需要需要來。你可以圍繞處理器的親和力來處理你的應用程序,但是在.NET級別上,這幾乎不是一個成功的策略。

任務並行庫包含一個「分區程序」的概念,可用於控制工作的分佈,這是一個更好的解決方案,控制核心上的線程分佈。

我該如何識別在其上運行線程並將線程歸於特定核心的核心?

你不應該這樣做。 .NET線程不一定與操作系統線程相對應;你處於比這更高的抽象層次。現在,默認的.NET主機確實是映射線程1對1,所以如果你想依賴一個未公開的實現細節,那麼你可以通過抽象並使用P/invoke來確定/驅動你的處理器關係。但如上所述,這沒有用。

什麼.NET 4.0+任務並行庫啓用,這是以前的.NET版本不可能做到的?

什麼都沒有。但它確實使得並行處理(和多線程)更容易得多

你能給我提示如何具體建立在預.NET4(在.NET3.5)並行代碼,因爲考慮到我熟悉多線程開發的帳戶?

首先,沒有理由爲該平臺開發。沒有。 .NET 4.5已經不在了,最後一個版本(.NET 4.0)支持下一個較舊版本(.NET 3.5)所做的所有操作系統。

但是,如果您真的想要,您可以通過旋轉Thread對象或BackgroundWorker或通過將工作直接排隊到線程池來執行簡單的並行處理。所有這些方法都需要比TPL中的Task類型更多的代碼(特別是在錯誤處理周圍)。

+1

所以你不會考慮使用單個線程並行下載多個文件「並行處理」?或者使用多臺計算機的網格,每臺計算機都運行單個線程? – svick 2013-03-11 12:15:24

+0

這是個人的選擇。我對多個同時操作使用術語「併發」(所以「並行」是「多線程」的特例,這是「併發」的特例)。所以如果你有一個基於'async'的多文件下載,我會稱之爲「併發編程」,而不是「並行編程」。我會把電網稱爲「分佈式」。 AFAICT,這些術語沒有普遍接受的定義,所以這就是我選擇使用它們的方式。 – 2013-03-11 12:20:02

5

如果我問你「你用自己開發的語言編寫商業軟件嗎?或者在挖掘自己的井後喝水?」

這就是通過創建線程並對其進行管理來編寫多線程的區別,而您可以使用TPL對線程進行抽象化。核心上的多線程和線程調度在操作系統中進行維護,因此您無需擔心線程是否在您的系統支持AFAIK的核心上執行。

+0

這可能是那些知道答案,並不需要它已經很好的答案(我upvoted你的,雖然我喜歡更多的另一個,並驚訝它是undervoted) – Fulproof 2013-03-11 06:22:12

+0

@Fulproof::-),請downvote它,我didn不知道你知道。 – TalentTuner 2013-03-11 06:50:09

+0

我問我不知道並想知道的內容 – Fulproof 2013-03-11 13:16:37

2

檢查這個article,它基本上總結了TPL之前(幾乎)不可能實現的事情,儘管很多公司已經釀造了自己的並行處理庫,但它們都沒有經過充分優化以充分利用流行體系結構的所有資源只是因爲它的任務很大&微軟有很多資源+它們都很好)。另外值得注意的是Intel的對應實現TBB vs TPL

1

多線程曾經在單核CPU上可用。我相信在.NET世界中,「並行編程」代表編譯器/語言,以及名稱空間和「庫」添加,這些都有助於實現多核功能(比以前更好)。從這個意義上說,「並行編程」是多線程下的一個類別,它爲多個CPUa /內核提供了改進的支持。

我自己的思考:同時我看到.NET「並行編程」不僅包含多線程,還包含其他技術。考慮一下這樣一個事實,即新的異步/等待設施並不能保證多線程,因爲在某些情況下,它們只是可以在單個線程上完成所有任務的延續傳遞式範例的抽象。包含來自運行不同進程(可能位於不同機器)的混合並行性,從這個意義上說,多線程只是「並行編程」這個更廣泛概念的一部分。

但是,如果你考慮.NET發佈,我認爲前者是一個更好的解釋。

+0

您是否回答暗示可以在同一個(單個)線程中進行異步調用? – Fulproof 2013-03-11 13:19:13

+1

是的,在某些條件下。如果我沒有弄錯,文獻經常提到異步/等待並不能保證在不同的線程上執行。當我挖掘解釋,我遇到了一些[偉大的職位由Eric Lippert](http://social.msdn.microsoft.com/Search/en-US?query=Continuation%20Passing%20Style%20Revisited&beta=0&rn=Fabulous+ Adventures + In + Coding&rq = site:blogs.msdn.com/b/ericlippert/&ac=4) - 在他的博客上搜索「Continuation Passing Style Revisited」 – 2013-03-12 02:40:47

+0

謝謝,我在.NET 4上,更喜歡推遲挖掘。 NET 5.0的概念。如果你在.NET 4(或之前)中發現任何東西,請分享它 – Fulproof 2013-03-12 07:26:01

2

這是否意味着使用以前版本的.NET不可能使用多核d和並行編程應用程序?

不是。像ThreadThreadPool用於調度計算上的其他線程和ManualResetEvent用於同步類型在那裏,因爲淨1.

如何控制多核/並行使用/芯之間在.NET多線程應用程序ditribution?

不,這主要是操作系統的工作。您可以將ProcessorAffinity設置爲ProcessThread,但是沒有簡單的方法從Thread獲取ProcessThread(因爲最初認爲.Net Thread可能不直接對應於OS線程)。通常沒有理由這樣做,特別是不應該爲ThreadPool線程執行此操作。

什麼.NET 4.0+任務並行庫啓用,這是以前的.NET版本不可能做到的?

我想說它並沒有讓任何不可能的事情成爲可能。但它使許多任務更簡單。

您可以隨時編寫自己的ThreadPool版本,並手動使用同步原語(如ManualResetEvent)進行線程之間的同步。但正確而有效地做到這一點是很多容易出錯的工作。

.NET在開發多線程應用程序和並行編程之間有什麼區別?

這只是一個命名問題,與您以前的問題沒有多大關係。並行編程意味着同時執行多個操作,但並沒有說明如何實現並行性。爲此,您可以使用多臺計算機,多個進程或多個線程,甚至可以使用一個線程。

(如果操作不CPU綁定,就像從磁盤讀取文件或從互聯網上獲取一些數據在單個線程並行編程可以工作。)

所以,多線程編程是一個子集並行編程,儘管在.NET上最常用。

相關問題