程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Windows核心編程讀書筆記-第六章線程基礎,讀書筆記第六章

Windows核心編程讀書筆記-第六章線程基礎,讀書筆記第六章

編輯:C++入門知識

Windows核心編程讀書筆記-第六章線程基礎,讀書筆記第六章


1.相較於線程,進程所使用的系統資源更多。其原因在於地址空間。為一個進程創建一個虛擬的地址空間需要大量系統資源。線程只有一個內核對象和一個棧。

2.線程的入口函數

DWORD WINAPI ThreadFunc(PVOID pvParam){
	DWORD dwResult = 0;
	...
	return(dwResult);
}

線程函數的幾點說明

  • 線程函數可以任意命名。
  • 線程函數只有一個參數,而其意義由我們(而非操作系統)來定義。因此,我們不必擔心ANSI/Unicode問題。
  • 線程函數必須返回一個值,它會成為該線程的退出代碼。
  • 線程函數應該盡可能使用函數參數和局部變量。函數的參數和局部變量是在線程棧上創建的。

3.CreateThread函數

HANDLE CreateThread(
	PSECURITY_ATTRIBUTES psa,
	DWORD cbStackSize,
	PTHREAD_START_ROUTINE pfnStartAddr,
	PVOID pvParam,
	DWORD dwCreateFlags,
	PDWORD pdwThreadID);

調用CreateThread函數,系統從進程的地址空間中分配內存給線程棧使用。新線程在與負責創建的那個線程在相同的進程上下文中運行。因此,新線程可以訪問進程內核對象的所有句柄、進程中的所有內存以及同一個進程中其他所有線程的棧

注意:CreateThread函數是用於創建線程的Windows函數。不過,如果編寫的是C/C++代碼,就絕對不要調用CreateThread。相反,正確的選擇是使用Microsoft C++運行庫函數_beginthreadex

(1)psa參數

如果想使用線程內核對象的默認安全屬性,可以向此參數傳入NULL。

(2)cbStackSize參數

cbStackSize參數指定線程可以為其線程棧使用多少地址空間。當CreateProcess函數從開始一個進程的時候,它會在內部調用CreateThread來初始化進程的主線程。對於cbStackSize參數,CreateProcess使用了保存在可執行文件內部的一個值。預定的地址空間的容量設定了棧空間的上限,這樣才能捕獲代碼中的無窮遞歸bug

(3)pfnStartAddr和pvParam參數

pfnStartAddr參數指定希望新線程執行的線程函數的地址。線程函數的pvParam參數與當初傳給CreateThread函數pvParam參數是一樣的。

(4)dwCreateFlags參數

dwCreateFlags參數指定額外的標志來控制線程的創建。

(5)pdwThreadID參數

該參數必須是DWORD的一個有效地址。CreateThread函數用它存儲系統分配給新線程的ID。

4.終止運行線程

線程可以通過以下4種方法來終止運行

線程函數返回(這是強烈推行的)。

線程通過調用ExitThread函數“殺死”自己。

同一個進程或另一個進程中的線程調用TerminateThread函數

包含線程的進程終止運行(這種方法避免使用)

5.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved