windows下執行緒入門

2021-10-23 04:43:18 字數 1819 閱讀 2473

以下內容引述《windows核心程式設計》

執行緒的核心物件,作業系統用它管理執行緒,系統還用核心物件來存放執行緒統計資訊的地方;

執行緒棧,用於維護執行緒執行時所需的所有函式引數和區域性變數

對於用msvc編譯器生成的應用程式,這個執行緒首先會執行c/c++執行庫的啟動**,後者呼叫入口點函式(_tmain或者_twinmain),直入口點函式返回c/c++執行庫的啟動**,後者最終將呼叫exitprocess

handle createthread

( psecurity_attributes psa,

dword cbstacksize,

pthread_start_routine pfnstartaddr,

pvoid pvparam,

dword dwcreateflags,

pdword pdwthreadid)

;

呼叫createthread是,系統會建立乙個執行緒核心物件,該核心物件提供給作業系統用於管理執行緒。同時,系統從程序的位址空間中分配記憶體給執行緒棧使用。新執行緒與負責建立的那個執行緒在相同的程序上下文中執行。因此,新執行緒可以訪問程序核心物件的所有控制代碼、程序中的所有記憶體以及同乙個程序中其他所有執行緒的棧。

推薦使用_beginthreadex函式在c/c++程式設計中建立執行緒。

在幾乎所有的應用程式中,所有的使用者介面元件(視窗)都應該共享同乙個執行緒。乙個視窗的所有子視窗無疑應該由乙個執行緒來建立。有時,也許需要在不同的執行緒上建立不同的視窗,但這類情形相當少見。

通常,應用程式有乙個使用者介面執行緒,此執行緒負責建立所有視窗,另外還負責getmessage迴圈。程序中的其他所有執行緒都是受計算機能力的制約或者受i/o(輸出/輸入)限制的工作執行緒,這些執行緒永遠不會建立視窗。

使用者介面執行緒的優先順序永遠高於工作執行緒。

執行緒核心物件的壽命至少可以達到他們相關聯的執行緒那樣長。不過,物件的壽命可能超過執行緒本身的壽命。

預設情況下,主線程的入口函式必須命名為main,wmain,winmain或者wwinmain。但是執行緒函式可以隨意命名;

程序的函式入參,提供了ansi/unicode版本供我們選擇;而執行緒只有乙個引數;

執行緒函式必須返回乙個值,成為該執行緒的退出碼;類似於c/c++執行庫的策略:領主執行緒的退出**成為程序的退出**。

執行緒盡可能使用函式引數和區域性變數。

終止的方式

執行緒函式返回(推薦)

執行緒呼叫exitthread函式「殺死」自己

同乙個執行緒或另乙個程序中的執行緒呼叫terminatethread函式(避免)

包含執行緒的程序終止執行(避免)

其中1.執行緒函式返回的方式,是正確處理執行緒的唯一方式,可以確保一下正確的應用程式清理工作都可以執行

而2.呼叫exitthread函式的方式,將終止執行緒的執行,並導致作業系統清理該執行緒使用的而所有作業系統資源。但是,c/c++資源(如c++類物件)不會被銷毀。因為exitthread函式和createthread函式一樣,都是windows函式,並不是c/c++函式。使用_endthreadex替代exitthread函式。

3.呼叫terminatethread函式可以殺死乙個執行緒,而不僅僅只有主調執行緒,terminatethread可以殺死任意執行緒。該函式是非同步的,需要調湧waitforsingleobject或類似的函式,並向其傳遞執行緒的控制代碼。

程序終止,exitprocess和teminateprocess可用於終止執行緒執行,區別是這些函式會使終止執行的程序中的所有的執行緒全部終止。同時,由於整個程序都會關閉,所有的系統資源肯定會被清理。其中必然包括所有執行緒的堆疊。但是這樣意味著正確的應用程式清理工作不會執行:c++物件的析構函式不會被呼叫,資料不會會寫到磁碟……

執行緒終止:

MFC 下執行緒

做變數宣告,賦值等前期工作 return 0 if isthreadpause 暫停響應函式,也不變 void cplayerdlg onbnclickedstop if pplayerthread isthreadpause false 原來的terminatethread不用,換成下面這個 po...

Linux下執行緒

此文講述的執行緒為linux下,其執行緒庫函式是由posix標準定義的,稱為posix thread或者pthread。在linux上線程函式位於libpthread共享庫中,因此在編譯時要加上 lpthread選項。建立執行緒 終止執行緒 等待執行緒 三個函式都為pthread.h中定義,其中要注...

Windows核心程式設計 (五)使用者模式下執行緒同步

1 原子訪問 interlocked系列函式 該系列的函式會保證對乙個值得遞增操作是原子操作,即不會被打斷。2 高速緩衝行 當cpu從記憶體中讀取乙個位元組的時候,它並不是從記憶體中取回乙個位元組,而是取回乙個高速緩衝行。高速緩衝行存在的目的是為了提高效能。一般來說,應用程式會對一組相鄰的位元組進行...