1. 程式人生 > >015 線程創建

015 線程創建

內核對象 需要 blog 指針 x64 函數 security 初始 推出

線程
  ● 進程啟動
    ○ 進程內核對象 進程空間
    ○ 線程
  ● 可以通過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 線程創建