c 執行緒基礎

2022-03-22 17:42:02 字數 2797 閱讀 7736

程序(process)是引用程式的例項要使用的資源的乙個集合(程序就是一種資源,是應用程式所用的資源,乙個exe就是乙個程序),每個程序都被賦予了乙個虛擬位址空間,每個應用程式都在各自的程序中執行來確保應用程式不受其他應用程式的影響,程序是作業系統為我們提供的一種保護應用程式的一種機制。

執行緒(thread)的職責是對cpu進行虛擬化,windows為每個程序都提供了該程序專業的執行緒(功能相當於乙個cpu,可將執行緒理解成乙個邏輯cpu),執行緒是程序中基本執行單元, 乙個程序中可以包含多個執行緒,在程序入口執行的第乙個執行緒是乙個程序的主線程,在.net應用程式中,都是以main()方法作為程式的入口的, 所以在程式執行過程中呼叫這個方法時,系統就會自動建立乙個主線程。(他們之間的關係簡單說:執行緒是程序的執行單元,程序是執行緒的乙個容器了)。

clr將每個執行緒要麼視為前台執行緒,要麼視為後台執行緒,乙個程序中所以前台執行緒停止執行時,clr強制終止仍在執行的後台執行緒,這些後台執行緒被直接終止,不好丟擲異常。因此,前台執行緒應該用於執行確實想完成的任務,比如講資料庫記憶體緩衝器flush到磁碟,另外,應該為非關鍵的任務使用後台執行緒,比如 重新計算電子**的單元格,或者為記錄建立索引。這是由於這些工作能在應用程式重啟時繼續,而且如果使用者想終止應用程式,就沒有必要強波她儲存活動狀態。下面通過**我看看前台執行緒與後台執行緒的區別:

class

program

private

static

void

worker()

}

執行上面**可以發現:控制台中顯示字串: return form main thread 後就退出了, 字串 return from worker thread字串根本就沒有顯示,這是因為此時的backthread執行緒為後台執行緒,當主線程(執行main方法的執行緒,主線程當然也是前台執行緒了)結束執行後,clr會強制終止後台執行緒的執行,整個程序就被銷毀了,並不會等待後台執行緒執行完後才銷毀。如果把 backthread.isbackground = true; 注釋掉後, 就可以看到控制台過5秒後就輸出 return from worker thread。再在worker方法最後加一句 **:console.read();  就可以看到這樣的結果了

執行緒核心物件(thread kernel object)os(作業系統)為系統中建立的每個執行緒都分配並初始化這種資料結構之一,在改資料結構中,包含一組對執行緒進行描述的屬性,資料結構中還包含所謂的執行緒上下文(thread context),上下文是乙個記憶體塊,其中包含了cpu的暫存器集合,windows在一台x86cpu的計算機執行時,執行緒上下文使用約700位元組的記憶體,物件x64和ia64cpu,上下文分布使用約1240位元組和2500位元組的記憶體

執行緒環境快(thread environment block,teb)teb是在使用者模式(應用程式**能快速訪問的位址空間)中分配和初始化的乙個記憶體卡,teb耗用1個記憶體頁(x86和x64cpu中是4k,ia64cpu中是8kb)。teb包含執行緒的異常處理鏈首,執行緒進入的每個try快都在鏈首插入乙個位元組,執行緒退出try快時,會從鏈中刪除該節點,除此之外,teb還包含執行緒的 「執行緒本地儲存」資料,以及有gdi喝opengl圖形使用到一些資料結構。

使用者模式棧(user-mode stack)使用者模式棧用於儲存給方法的區域性變數和實參,它還包含乙個位址;指出當前方法返回時,執行緒接著應該從什麼地方開始,預設情況下,windows為每個執行緒的使用者模式棧分配1mb記憶體。

核心模式棧(kernel-mode stack) 應用程式**向作業系統中的乙個核心模式的函式傳遞實參時,還會使用核心模式棧,出於安全方面的原因,針對使用者模式的**傳給核心的任何實參,windows都會把它們從執行緒的使用者模式棧複製到執行緒的核心模式棧。一經複製,核心就可驗證實參的值,由於應用程式**不能訪問核心模式棧,所以應用程式無法修改驗證之後的實參值,os核心**將開始對複製的值進行處理,除此之外,核心會呼叫它自己的內部方法,並利用核心模式棧傳遞它自動的實參、儲存函式的區域性變數以及儲存返回位址。在32位windows上執行時,核心模式棧大小為12kb;在64為windows上執行時,大小為24kb.

dll執行緒連線(attach)和執行緒分離(detach)通知windows的乙個策略是,任何時候在程序建立乙個執行緒,都會呼叫那個程序中載入的索引dll的dllmain方法,並向該方法傳遞乙個dll_thread_attach標誌。類似的,任何時候乙個執行緒終止,都會呼叫程序中所以dll的dllmain方法,並向該方法傳遞乙個dll_thread_detach標誌,有的dll需要利用這些通知,為程序中建立/銷毀的每個執行緒執行一些特殊的初始化清理操作,例如 c—runtime庫dll會分配一些執行緒本地儲存狀態,執行緒只要c-runtime庫中包含的函式時,需要這些狀態

看了建立執行緒時消耗,讓我乙個執行緒小白也懂的了,執行緒雖好,小友可不要貪杯哦!當然微軟也為我們提供了解決方案那就是執行緒池大哥了,關於執行緒池的使用我們後面在介紹,  但是執行緒還是有執行緒的優勢,我們在選擇何時何地使用執行緒就變得更重要了

在選擇使用執行緒的時候需要知道我們的任務是 計算密集型還是io密集型

io密集型,涉及到網路、磁碟io的任務都是io密集型任務,這類任務的特點是cpu消耗很少,任務的大部分時間都在等待io操作完成(因為io的速度遠遠低於cpu和記憶體的速度)。對於io密集型任務,任務越多,cpu效率越高,但也有乙個限度。常見的大部分任務都是io密集型任務,比如web應用。

我的理解是對於計算密集型的任務,因為是消耗cpu資源,我個人覺得應該建立執行緒去後台執行,要充分利用多個cpu的資源

而對於io密集型的任務應該使用非同步執行

C 執行緒基礎

執行緒可以說是輕型的程序 多執行緒共享程序的位址空間和資源使得執行緒的上下文切換優於程序 由於執行緒共享資源就會有搶占資源的情況主要的手段有 互斥鎖 條件變數 訊號量等等 簡單回顧下c 多執行緒 include pthread create thread,attr,start routine,arg...

C 執行緒運用基礎

threadstart ts new threadstart a.f threadstart 是乙個委託,用以關聯a.f方法 thread th new thread ts thread是乙個類,例項化物件時呼叫的構造函式引數為ts這個委託物件 th.start 執行緒開始 執行緒的同步控制 1.使...

c語言基礎 執行緒

在標頭檔案 threads.h 中,定義和宣告了支援多執行緒的巨集 型別和函式。所有直接與執行緒相關的識別符號,均以字首 thrd 作為開頭。例如,thrd t 是乙個物件型別,它標識了乙個執行緒。建立並開始執行乙個新執行緒thrd create int thrd create thrd t thr...