簡體   English   中英

並行編程TPL

[英]Parallel Programming TPL

當您產生多個任務時,如下所示:

 for (int i = 0; i < 1000000; i++) {
        // create a new task
        tasks[i] = new Task<int>((stateObject) => {
            tls.Value = (int)stateObject;

                for (int j = 0; j < 1000; j++) {
                // update the TLS balance
                tls.Value++;
                }

            return tls.Value;
            }, account.Balance);

        tasks[i].Start();
 }

這些任務基本上是在ProcessThread上運行的。 因此,我們可以為1,000,000個任務將1個進程線程切片1,000,000次。

TPL任務調度程序是否可以查看操作系統並確定我們在多核計算機上具有8個虛擬進程線程,然后在這8個虛擬進程線程之間分配1,000,000個任務的負載?

現在,任務基本上在ProcessThread..so上運行,因此,我們可以將1個進程線程切片1000000次,以執行1000000個任務。

這不是真的。 Task!=線程,特別是不等於ProcessThread 多個任務將安排在單個線程上。

是TPL任務調度程序查看操作系統並確定多核計算機中有8個虛擬進程線程,因此在這8個虛擬進程線程之間分配了1000000個任務的負載嗎?

實際上,是的。 使用默認的TaskScheduler(如上操作)時,任務在ThreadPool線程上運行。 1000000個任務將不會創建1000000個線程(盡管它將使用的線程數超過您提到的8個...)

話雖這么說,通常通過Parallel.ForParallel.ForEach處理數據並行性(例如,在巨型for循環中循環)要好得多。 在內部,Parallel類將使用Partitioner<T>將工作分解為更少的任務,這將給您帶來更好的總體性能,因為它的開銷要少得多。 有關更多詳細信息,請參閱我在TPL中進行分區的文章。

大致來說,您當前的代碼在ThreadPool上推送了1000000個任務。 當這些任務花費大量時間時,您可能會遇到問題。

在這種情況下,請務必使用

Parallel.For(0, 1000000, ...);

然后您不僅擁有調度程序,而且更重要的是還有一個分區程序可以幫助您分配負載。
更不用說它更具可讀性。

暫無
暫無

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

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