2015-05-04 23 views
-3

我有一個List<Task>(或用於Run()方法的List<Action>)在控制檯應用程序中。說如果我不使用TPL,但我改用下面的代碼。是否在循環中運行幾個Task.Run()或Task.Start()負責平衡

myTasks.ForEach (t => t.Start()); 

OR

myActions.ForEach(a => Task.Run(a)); 

哪一個以上將並行運行的任務。並且他們中的任何一方或兩方是否會像透明地處理CPU內核之間的負載平衡一樣,TPL呢?

如果上面的代碼並行工作,那麼TPL會在哪裏?

+0

如果您有任務,那麼*按照定義*,您正在使用TPL。 – Servy

+0

@Luaan你剛剛提到的大部分內容都不適用於可開始的任務。 – Servy

+0

您所做的只是使用'List'擴展名'ForEach'來對集合執行操作。我不知道爲什麼你會期望從這個複雜的負載平衡。 – Jonesopolis

回答

2

以上哪一項將並行運行任務?

Task沒有Run方法。當您將代理人傳遞給new Task時,它只有Start方法,您不應該使用該方法。改爲使用Task.Run

,是他們中的任何一個或兩個要採取的負載平衡的CPU內核之間的關懷透明

兩個執行的線程池線程給定的委託,他們都沒有desides上核心他們得到執行。這隻能由底層的操作系統來管理。

即使世界一個great article都到長度約併發:

工人線程池:設計在CPU並行的水平提供服務,工作人員線程池採用多核架構的優勢。 CPU並行性有兩個主要考慮因素:快速優化調度工作;並限制了並行度。對於前者,ThreadPool實現使用諸如無鎖隊列之類的策略來避免爭用和工作竊取以實現負載平衡。

+0

TPL是否會覆蓋底層的操作系統行爲並執行神奇的負載平衡? – fahadash

+0

不。TPL只是提供了一個線程池的抽象,它負責平衡不同的操作系統。 –

+1

@fahadash它不覆蓋行爲。它利用操作系統提供的工具並擴展它們,以提供它的行爲,這是現存的每一種類型的行爲。 – Servy