基於windows的多線程編程初步介紹

基於windows的多線程編程
基於windows下的多線程編程,首先我們需要了解創建線程的函數CreateThread,CreateThread將在主線程的基礎上創建一個新線程。

函數原型:
HANDLE CreateThread(LPSECURITY_ATTRIBUTElpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD Flags,LPDWORDlpThreadId)
參數說明:
參數1:指向SECURITY_ATTRIBUTES結構體的指針,一般設置該值爲NULL,表示缺省的安全性。
參數2:指定初始提交棧的大小,以字節爲單位。系統會將這個值向上四捨五入爲系統頁面大小的倍數。頁面是操作系統在管理內存時,使用的一個內存單元。不同的cpu的頁面大小是不同的,32位系統的頁面大小爲4KB。如果這個值是0或小於缺省提交的大小時,缺省將使用與調用該函數的線程相同的棧空間大小。
參數3:指針類型。指向LPTHREAD_START_ROUTINE類型的應用函數,表示了線程入口函數的地址。
參數4:指定傳遞給線程的參數。向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,爲NULL。
參數5:線程標誌。當 Flags == CREATE_SUSPENDED表示線程創建後處於暫停狀態,直到ResumeThread函數調用才啓動線程。若Flags==0,線程創建後立即運行。
參數6:參數6爲輸出參數,指向一個接受線程標識符的變量。當我們創建一個線程時,系統會爲這個線程分配一個ID號。若不想返回線程ID,設置值爲NULL。
返回值:函數成功,返回線程句柄;函數失敗返回false。

對於單CPU系統,多線程的實現是利用時間片交替進行。
<span style="font-size:18px;">#include <iostream>   
#include <windows.h>   
using namespace std;   
 
DWORD WINAPI fun1Proc(LPVOID lpParam);
void main()
{
	HANDLE hThread1;
	hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
	CloseHandle(hThread1);
	cout<<"main thread is running\n";
	Sleep(100);

}
DWORD WINAPI fun1Proc(LPVOID lpParam)
{
	cout<<"the thread1 is running"<<endl;

	return 0;
}</span>

在主線程中使用CloseHandle函數關閉句柄,並沒有終止新創建的線程。關閉句柄時,操作系統會遞減新線程的線程內核對象的使用計數,當使用計數爲0,系統會釋放線程內核對象。如果在主線程當中,沒有關閉句柄,始終會保留一個引用,這樣線程內核對象的使用計數不爲0,此時即使我們這個線程執行完畢,那麼線程內核對象也不會被釋放,直到等到進程終止時候,操作系統纔會爲殘留對象做清理工作。

不同的線程對同一資源進行訪問時候,會出現一些意想不到的錯誤,此時我們需要線程間的同步。線程間的同步就是保證一個線程在訪問一種資源的時候,其他的線程在這個時間段之內不能夠對這個資源進行訪問。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章