015 線程創建
阿新 • • 發佈:2017-06-13
內核對象 需要 blog 指針 x64 函數 security 初始 推出
指向線程函數入口 的指針 線程開始的地址
參數4:lpParameter
向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,為NULL。
參數5:dwCreationFlags
線程標誌,可取值如下
CREATE_SUSPENDED(0x00000004):創建一個掛起的線程
STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數指定初始的保留堆棧 的大小, 否 則,dwStackSize指定提交的大小
參數6:lpThreadId
保存新線程的id
線程
● 進程啟動
○ 進程內核對象 進程空間
○ 線程
● 可以通過IDE設置入口函數
● 自己創建線程
○ 創建線程函數 CreateThread()
○ 新建線程內核對象(結構體)
● 線程
○ 分配一塊內存空間,作為當前線程的堆棧
○ 兩條在同一進程內線程,都是隔離的
○ 線程他們是封閉的,每個線程都有自己的一個堆棧
○ 但是都是屬於當前進程內的堆棧
○ 進程賦予了線程交互的能力
● 線程創建
1 HANDLE WINAPI CreateThread( 2 _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,3 _In_ SIZE_T dwStackSize, 4 _In_ LPTHREAD_START_ROUTINE lpStartAddress, 5 _In_opt_ LPVOID lpParameter, 6 _In_ DWORD dwCreationFlags, 7 _Out_opt_ LPDWORD lpThreadId 8 );
參數1:lpThreadAttributes
NULL使用默認安全性,不可以被子線程繼承,否則需要定義一個結構體將它的bInheritHandle成員初始化為TRUE
參數2:dwStackSize
設置初始棧空間的大小,可以設置數值,也可以不設置數值,不設置的話由抱編譯器保留大小一般默認位1MB
參數3:lpStartAddress
指向線程函數入口 的指針 線程開始的地址
參數4:lpParameter
向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,為NULL。
參數5:dwCreationFlags
線程標誌,可取值如下
CREATE_SUSPENDED(0x00000004):創建一個掛起的線程
STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數指定初始的保留堆棧 的大小, 否 則,dwStackSize指定提交的大小
參數6:lpThreadId
保存新線程的id
● 主線程退出和其他線程退出的區別
● 主線程退出 代表進程結束,全部線程推出
● 子線程主線程退出,子線程主線程會執行完成後才會退出
1 #include <stdio.h> 2 #include <tchar.h> 3 #include <windows.h> 4 5 //啟動了線程mainStartup 6 7 DWORD __stdcall MyMain1(LPVOID lParam) 8 { 9 int nParam = (int)lParam; 10 _tprintf(TEXT("nParam = %d\r\n"),nParam); 11 return 0; 12 13 } 14 15 DWORD __stdcall MyMain(LPVOID lParam) 16 { 17 int nParam = (int)lParam; 18 HANDLE hThread = CreateThread(nullptr,0,MyMain1,(LPVOID)0x64,0,nullptr); 19 CloseHandle(hThread); 20 Sleep(1); 21 _tprintf(TEXT("nParam = %d\r\n"),nParam); 22 return 0; 23 } 24 25 int main() //主線程 線程看書 26 { 27 HANDLE hThread = CreateThread(nullptr,0,MyMain,(LPVOID)0xFFFFFFFF,0,nullptr); 28 CloseHandle(hThread); //記得關閉線程 29 30 while(true) 31 { 32 Sleep(100); 33 } 34 35 36 return 0; 37 }
015 線程創建