015 线程创建

线程 
  ● 进程启动
    ○ 进程内核对象 进程空间
    ○ 线程
  ● 可以通过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
"),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
"),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 }

原文地址:https://www.cnblogs.com/sdk123/p/7003558.html