windows為什麼要支援執行緒?
在計算機的早期歲月,作業系統沒有提供執行緒的概念。事實上,整個系統只執行著乙個執行執行緒,其中同時包含作業系統**和應用程式**。只用乙個執行執行緒的問題在於,長時間執行的任務會阻止其他任務執行。例如,在16位windows的那些日子,列印乙個文件的應用程式很容易「凍結」整個機器,造成os和其他應用程式停止響應。有的應用程式含有bug,會造成無線迴圈,這同樣會造成整個機器停止工作。
所以microsoft計畫構建乙個新的os來滿足企業和個人的需要。這個新os必須健壯,可靠,易於伸縮以及安全,而且它必須改進16位windows的許多不足。
microsoft設計這個os核心時,他們決定在乙個程序(process)中執行應用程式的每個例項。程序不過是應用程式乙個例項要使用的資源的集合。每個程序都被賦予了乙個虛擬位址空間,確保乙個程序使用的**和資料無法被另乙個程序訪問。這就確保了應用程式的健壯性。除此以外,os的核心**和資料是程序無法訪問的,所以應用程式**破壞不了作業系統**和資料。
如果機器只有乙個cpu,它會執行無線迴圈,不能執行其他任何東西。所以,雖然無法被破壞,而且更安全,但系統仍然可能停止響應。microsoft需要修正這個問題,他們拿出的方案就是執行緒。執行緒(thread)的職責是對cpu的虛擬化。windows為每個程序都提供了該程序專用的執行緒(功能相當與乙個cpu,可將執行緒理解為乙個邏輯cpu)。如果應用程式的**進入無限迴圈,與那個**關聯的程序會「凍結」,但其他程序(它們有自己的執行緒)不會凍結:它們會繼續執行!
執行緒開銷
上下文切換
單cpu的計算機一次只能做一件事情。所以windows必須在系統的所有執行緒(邏輯cpu)之間共享物理cpu。
在任何給定的時刻,windows只將乙個執行緒分配給乙個cpu。那個執行緒允許執行乙個「時間片」。一旦時間片到期,windows就上下文切換到另乙個執行緒,大概每30ms執行乙個上下文切換。windows通過執行上下文切換,向使用者提供乙個健壯的,響應靈敏的作業系統。
應該指出的是,安裝多個cpu的計算機課可以真正地同時執行幾個執行緒,這提公升了應用程式的可伸縮性(在少量時間裡做更多工作的能力)。windows為每個cpu核心都分配乙個執行緒,每個核心都自己執行到其他執行緒的上下文切換。windows確保單個執行緒不會同時在多個核心上排程,因為這回帶來巨大的混亂。
前台執行緒和後台執行緒
clr將每個執行緒要麼視為前台執行緒,要麼視為後台執行緒。乙個程序的所有前台執行緒停止執行時,clr將強制終止仍在執行的後台執行緒。這些後台執行緒會被直接終止,不會丟擲異常。
因此,前台執行緒應該用於執行確實想要完成的任務,比如將資料從記憶體儲存到資料庫。另外,對非關鍵的任務使用後台執行緒,比如重新計算今天的訂單額度等。這是由於這些工作能在程式重啟後繼續。
應用程式的主線程以及通過構造乙個thread物件來顯示建立任何執行緒都預設為前台執行緒。另一方面,執行緒池預設為後台執行緒。此外,由進入託管執行環境的本地(native)**建立的任何執行緒都被標記為後台執行緒。
以上內容來自《clr via c#》
Windows執行緒基礎
文章 自 執行緒由兩部分組成 執行緒核心物件和執行緒棧。關於核心物件請看 windows核心物件簡介。執行緒核心物件,作業系統用執行緒核心物件來管理執行緒,作業系統還用它來存放統計資訊。執行緒棧,用於維護執行緒執行時所需的所有函式引數和區域性變數,就是c 程式設計師常說的執行緒棧和託管堆中的執行緒棧...
多執行緒之二,windows下的多執行緒 基礎
如下 thread.cpp win32執行緒庫,目前只能是演示的強度 作者 galphy 2005 6 20 推薦使用ide dev c 基於g 輕巧 include include typedef unsigned long stdcall threadfunc void class thread...
Windows執行緒庫
win32 api是windows作業系統為核心以及應用程式之間提供的介面,將核心提供的功能進行函式封裝,應用程式通過呼叫相關的函式獲得相應的系統功能。mfc是微軟基礎函式類庫,由微軟提供的,用類庫的方式將win32 api進行封裝,以類的方式開發者。handle 控制代碼是一種指向指標的指標。指標...