C 多執行緒開發之任務並行庫詳解

2022-09-25 23:42:11 字數 1840 閱讀 2999

目錄

之前學習了執行緒池,知道了它有很多好處。

使mvsaevt用執行緒池可以使我們在減少並行度花銷時節省作業系統資源。可認為執行緒池是乙個抽象層,其向程式設計師隱藏了使用執行緒的細節,使我們可以專心處理程式邏輯,而不是各種執行緒問題。

但也不是說我們所有的專案中都上線程池,其實它也有很多弊端,比如我們需要自定義使用非同步委託的方式才可以將執行緒中的訊息或異常傳遞出來。這些如果在乙個大的軟體系統中,會導致軟體結構過於混亂,各個執行緒之間訊息傳遞來傳遞去的,如果發生沒有處理掉的異常,很容易導致軟體出現致命錯誤。

為了解決這個問題,在.net framework 4.0中引入了乙個新的非同步操作的api,它叫任務並行庫(tpl)。

那麼接下來,讓我們一起來認識一下這個tpl,看看它到底有什麼魔力可以把執行緒池中的棘手問題解決掉。

tpl又被認為是執行緒池的有乙個抽象,其對程式設計師隱藏了執行緒池互動的底層**,並只提供了更方便的細粒度的api。

tpl的核心是任務。乙個任務代表乙個非同步操作,該操作可以通過多種方式執行,可以使用或不使用獨立執行緒執行。

tpl有乙個關鍵優勢,就是乙個任務可以通過多種方式和其它任務組合起來。

比如可以同時開啟多個任務,等待所有任務完成,然後執行乙個任務對之前所有任務的結果進行一些計算。

可以使用aggregateexception來捕獲底層任務內部所有異常,並允許單獨處理這些異常。在c#5.0中已經內建了對tpl的支援,允許我們使用心得await和async關鍵字以平滑的、舒服的方式操作任務。

可以通過下面三種方式來建立任務。

var a1 = n程式設計客棧ew task(()=>tastmethod("執行緒01"));

a1.start();

task.run(()=>tastmethod("執行緒001")); //已棄用

task.factory.startnew(()=>tastmethod("執行緒02"));

task.factory.startnew(() => tastmethod("執行緒03"),taskcreationoptions.longrunning);

console.readkey();

在最新的.net 5.0中已經將任務快速啟動方式run,丟棄掉了。只能使用其餘的兩種。例項化的tast屬性,必須進行啟動,任mvsaevt務才可以執行。其餘的.net已經做了內建,只需要使用就預設自動開啟。

**程3開啟過程中,增加了taskcreationoptions.longruning引數,它表示標記該任務為長時間執行,結果該任務將不會使用執行緒池,而在單獨的執行緒中執行。然而根據執行該任務的當前任務排程程式,執行方式可能不同。

下面介紹下從任務中得到其計算法返回的結果。

static void main(string args)

static int tastmethod(string name)

輸出結果

這裡我們宣告並執行了執行緒01並等待結果,該任務會被放置**程池中,並且主線程會等待,直到任務返回前一直處於阻塞狀態。

其實也可以呼叫方法runsynchronously()方法,使其特定執行在主線程。這是乙個非常好的優化,可以避免使用執行緒池來執行非常短暫的操作。

在非同步任務中,對於異常的處理是非常重要的。

trycatch (exception ex)

當程式啟動時,建立了乙個任務並嘗試同步獲取任務結果。result屬性的get部分會使當前執行緒等待直到該任務結束,並將異常傳播給當前執行緒。此時通過try/catch是很容易捕獲到的(需要注意aggregateexceptiont,它被封裝起來,)。

int result = a1.getawaiter().getresult ;

上面這種情況無需封裝異常,可以使用getawaiter和getresult方法來訪問任務結果。

多執行緒程式設計學習筆記 任務並行庫(一)

接上文 多執行緒程式設計學習筆記 基礎 一 接上文 多執行緒程式設計學習筆記 基礎 二 接上文 多執行緒程式設計學習筆記 基礎 三 接上文 多執行緒程式設計學習筆記 執行緒同步 一 接上文 多執行緒程式設計學習筆記 執行緒同步 二 接上文 多執行緒程式設計學習筆記 執行緒同步 三 接上文多執行緒程式...

C 使用任務並行庫 TPL

tpl task parallel library 任務並行庫 tpl 是 system.threading和 system.threading.tasks 命名空間中的一組公共型別和 api。tpl 的目的是通過簡化將並行和併發新增到應用程式的過程來提高開發人員的工作效率。使用執行緒池可以減少並行...

Task多執行緒並行開發

net 4.0之後出現的多執行緒物件。task 其實時thread 和threadpool的結合和優化 thread 通過windbg觀察執行完後gc下次 時間空間開銷不小,呼叫過多時間片切換頻繁影響效率 threadpool 受限cpu核心執行緒數,clr控制 task使用方法 new乙個新的ta...