C 使用任務並行庫 TPL

2022-03-31 17:18:02 字數 3295 閱讀 2707

tpl(task parallel library)

任務並行庫 (tpl) 是 system.threading和 system.threading.tasks 命名空間中的一組公共型別和 api。 tpl 的目的是通過簡化將並行和併發新增到應用程式的過程來提高開發人員的工作效率。

使用執行緒池可以減少並行操作時作業系統資源的開銷,然而使用執行緒池並不簡單,從執行緒池的工作執行緒中獲取結果也並不容易。於是就有了tpl,tpl可被認為是執行緒池上的又乙個抽象層,其對開發人員隱藏了與執行緒池互動的底層**,並提供了更細粒度的api。

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

更詳細的說明,可以訪問

如何建立乙個任務

使用task.run()方法或task.factory.startnew方法。

建立乙個控制台應用程式,輸入以下**

1

class

program217

1819

static

void

task1method()20"

);22}23

24static

void

task2method()25"

);27}28

29static

void

task3method()30"

);32

}33 }

執行結果如下

以同步方式執行任務

1

class

program217

18static

void taskmethod(string

name)

19 is running on a thread id : ,

" +

21 $"

is thread pool thread: ");

22 system.threading.thread.sleep(1000

);2324}

25 }

執行結果:

使用單獨執行緒的任務

如果任務的**將長時間執行,可以使用taskcreationoptions.longrunning來告訴任務建立乙個新執行緒,而不是使用執行緒池中的執行緒

示例**如下

1

class

program29

10static

void

taskmethod()

1115 }

執行結果:

使用任務來執行操作

1

class

program215

console.writeline(task.status);

16int result =task.result;

17 console.writeline($"

result is : ");

18}1920

static task createtask(string

name)

2124

25static

int taskmethod(string

name)

26 is running on a thread id : , is thread pool thread: ");

28//

模擬耗時操作

29 system.threading.thread.sleep(10000

);30

return0;

31}32 }

執行結果:

組合任務

使用task< tresult> . continuewith方法來

建立當另一任務完成時可以執行的延續任務。

當task1執行完成後,把task1返回的結果傳遞到下乙個任務

1

class

program2

" +

9 $"

thread id is :

" +

10 $"

is thread pool thread :

"),taskcontinuationoptions.onlyonrantocompletion);

11//

taskcontinuationoptions.onlyonrantocompletion 指定只應在延續任務前面的任務已完成執行的情況下才安排延續任務。

12//

13//

&view=netframework-4.8

1415

task1.start(); 16}

1718

static

int taskmethod(string name,int

seconds)

19 is running on thread id :

" +

21 $"

is thread pool thread: ");

22system.threading.thread.sleep(timespan.fromseconds(seconds));

23return

datetime.now.second;24}

25 }

執行結果:

使用任務並行庫

任務並行庫 task parallel library,tpl 可以被認為是執行緒池上的又乙個抽象層,其對程式設計師隱藏了與執行緒池互動的底層 並提供了更方便的細粒度的api。1.使用建構函式建立任務,傳入乙個lambda表示式作為action委託,呼叫start 啟動任務。2.使用task.run...

微軟並行庫初體驗之TPL

前端時間因為要做個大資料量分析,所以用c 寫了個指令碼跑,不過由於演算法複雜度問題,初步估計需要40小時才能跑完。為了加快運算,我一開始想到了 平行計算,利用mpich或其他類似的分布式計算框架開發,不過都比較麻煩。正巧微軟新出來的並行庫進入了我的視線,於是做了一次簡單的嘗試。此版本是第二版ctp,...

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

目錄 之前學習了執行緒池,知道了它有很多好處。使mvsaevt用執行緒池可以使我們在減少並行度花銷時節省作業系統資源。可認為執行緒池是乙個抽象層,其向程式設計師隱藏了使用執行緒的細節,使我們可以專心處理程式邏輯,而不是各種執行緒問題。但也不是說我們所有的專案中都上線程池,其實它也有很多弊端,比如我們...