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