C 多執行緒(二)

2021-06-21 05:53:16 字數 1740 閱讀 8792

每次建立乙個執行緒,都會花費幾百微秒級別的時間來建立乙個私有的區域性棧,每個執行緒預設使用1m的記憶體。這個可以在使用thread類的建構函式時設定:

new thread(new threadstart(go), 2);

new thread(new parameterizedthreadstart(go("hello")), 3);

提供的兩種建構函式方式都提供了對應的設定執行緒區域性棧的大小。執行緒池通過共享和**執行緒的方式來分配這些記憶體,這樣可以使多執行緒執行在乙個非常細粒度級別上而不影響效能。這對於充分利用多核處理器,使用分而治之的方式進行密集型計算的程式中很有用。同時執行緒池維護乙個所有同時執行的工作執行緒總數的上限,如果有過多的活動執行緒就會加重作業系統的負擔,使諸如cpu快取失效等問題,當達到這個上限後,就要進行排隊。這個執行緒佇列使得任意併發的應用成為可能,如web伺服器就是這種原理。

有多種方式進入執行緒池:

下面的應用間接地使用了執行緒池:

注意事項:

currenttread.isthreadpoolthread
1、使用tpl進入

使用tpl中的task類就可以很簡單的進入,使用task.factory.startnew方法,傳遞乙個目標函式的委託即可:

static void main(string args)

static void go()

task.factory.startnew返回乙個task物件可以用來監控這個任務。

同時可以使用泛型類task,如下:

static void main(string args)

console.readkey();

}static string go()

如果在工作執行緒中出現異常,當獲取task的result屬性時會重新引發aggregateexception異常,如果沒有查詢result或者沒有呼叫wait方法,所有未處理的異常都會終止程序執行。

2、不使用tpl

對於.net 4.0以前的版本是無法使用tpl的,必須使用threadpool.queueuserworkitem(類似task類功能)和非同步委託(類似task),但是這兩個沒有前面所述方法快、也沒有那麼方便和很好的擴充套件性。兩種方式的使用如下:

static void main()

static void go (object data) // data will be null with the first call.

static void main()

static int work (string s)

static void done (iasyncresult cookie)

執行緒池擁有的最大執行緒數可以通過threadpool.setmaxthreads設定,預設值如下:

執行緒池管理器在分配任務時通過新增新的執行緒來應對額外的工作量,當達到極限後開始排隊。在非活動的閒置期,管理器可以刪除一些可疑的執行緒從而可以得到更好的吞吐量。當然也可以使用thread.setminthreads來設定最小的執行緒數目:最小執行緒數是優化執行緒池的高階方式,這個將指導管理器對於執行緒的分配沒有延遲。提高最小數目可以當在有阻塞執行緒時提高併發量。

threadpool.setminthreads(50,50);
參考:

c 多執行緒 二

c 11 是 2011 年 9 月 1 號發布的。c 11 在 c 03 的基礎上做了大量的改進,引入了很多新的特性,比如 lambda 表示式,右值引用,統一的列表初始化方式,正規表示式等等。當然,其中最令人激動的特性是新標準引入了原子操作類和執行緒支援庫。c 一直在語言層面缺少對多執行緒的支援,...

C 多執行緒(二)

c c runtime 多執行緒函式 一 簡單例項 主線程建立2個執行緒t1和t2,建立時2個執行緒就被掛起,後來呼叫resumethread恢復2個執行緒,使其開始執行,呼叫waitforsingleobject等待2個執行緒執行完,然後推出主線程即結束程序。二解釋1 如果你正在編寫c c 決不應...

C 多執行緒系列(二)

static void main string args thread.start console.readkey static void threadone string content static void main string args static void threadone obje...