簡體   English   中英

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

[英]What is the difference in .NET between developing a multithreaded application and parallel programming?

最近我已經閱讀了很多關於.NET中的並行編程的內容,但我仍然對這個主題的文本中的語句相矛盾。

例如,彈出(在鼠標指向標記的圖標上時)stackoverflow.com task-parallel-library標記的描述

“任務並行庫是.NET 4的一部分。它是一組API,使開發人員能夠編寫多核共享內存處理器”

這是否意味着使用早期版本的.NET無法實現多核d和並行編程應用程序?

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

如何識別要運行線程的核心並將線程歸屬到特定核心?

什么啟用了.NET 4.0+任務並行庫 ,這在以前的.NET版本中是不可能的?

更新:
好吧,很難制定具體的問題,但我想更好地理解:

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

到目前為止,我無法理解它們之間的區別

UPDATE2:
MSDN “.NET Framework中的並行編程”從.NET 4.0版本開始,其文章任務並行庫告訴:

“從.NET Framework 4開始,TPL是編寫多線程和並行代碼的首選方式”

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

我認為“多線程”就像術語所說的那樣:使用多線程。

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

因此,並行處理是多線程的一種特殊情況。


這是否意味着使用早期版本的.NET無法實現多核d和並行編程應用程序?

一點也不。 你可以使用Thread類來完成它。 寫起來困難得多,而且難以理解。

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

不是真的,但你不需要 您可以為應用程序處理器處理器關聯性,但在.NET級別,這幾乎不是一個成功的策略。

任務並行庫包括一個“分區器”概念,可用於控制工作分配,這是一種更好的解決方案,可以控制線程在核心上的分布。

如何識別要運行線程的核心並將線程歸屬到特定核心?

你不應該這樣做。 .NET線程不一定與OS線程對應; 你處於比這更高的抽象層次。 現在,默認的.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類型更多的代碼(特別是在錯誤處理方面)。

如果我問你“你用自己開發的語言編寫商業軟件嗎?或者你在挖掘自己的井后喝水了怎么辦?”

這是通過創建線程並管理它們來編寫多線程的不同之處,而您可以使用TPL在線程上使用抽象。 在內核上維護多核和線程上的線程調度,因此您無需擔心線程是否在您的系統支持AFAIK的內核上執行。

查看這篇文章 ,它基本上總結了在TPL之前(幾乎)不可能的事情,盡管許多公司已經釀造了他們自己的並行處理庫,但沒有一個已經完全優化以利用流行架構的所有資源(僅僅因為它很大)任務和微軟有很多資源+他們很好)。 同樣值得注意的是英特爾的對應實施TBB與TPL

這是否意味着使用早期版本的.NET無法實現多核d和並行編程應用程序?

一點也不。 自.Net 1以來, ThreadThreadPool等類型用於在其他線程上調度計算,而ManualResetEvent用於同步。

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

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

什么啟用了.NET 4.0+任務並行庫,這在以前的.NET版本中是不可能的?

我說它沒有任何不可能的事情。 但它使許多任務變得更加簡單。

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

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

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

(如果操作不受CPU約束,則可以在單個線程上進行並行編程,例如從磁盤讀取文件或從Internet獲取某些數據。)

因此,多線程編程是並行編程的一個子集,盡管它是.Net上最常用的編程。

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

我自己的思考:與此同時,我看到.NET“並行編程”不僅包含多線程,還包括其他技術。 考慮到新的async / await工具不能保證多線程的事實,因為在某些情況下它們只是可以在單個線程上完成所有事情的延續傳遞式范例的抽象。 包含來自運行不同進程(可能在不同機器上)的混合並行性,從這個意義上講,多線程只是“並行編程”這一更廣泛概念的一部分。

但是如果你考慮.NET版本,我認為前者是一個更好的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM