main -> 主线程

每个线程都有自己的ID
每个线程都有自己的栈内存
同一个进程使用相同的地址空间

线程的调度

操作系统将CPU的执行时间划分为时间片,依次根据时间片不同执行不同的线程

创建线程(_beginthreadex()???)

	HANDLE CreateThread(                           //创建成功,返回线程句柄
		LPSECURITY_ATTRIBUTES lpThreadAttributes,	//指向线程安全属性的指针(已经废弃)
		DWORD dwStackSize,	                    //初始线程堆栈大小,以字节为单位(以兆来对齐)
		LPTHREAD_START_ROUTINE lpStartAddress,	//指向线程函数的指针
		LPVOID lpParameter,						//传给线程处理函数参数
		DWORD dwCreationFlags,					//创建方式(立刻执行0或者挂起执行CREATE_SUSPENDED)
		LPDWORD lpThreadId						//指向返回的线程ID
	);	 
	//定义线程处理函数
	DWORD WINAPI/CALLAPI ThreadProc(
		LPVOID lpPrameter  						//创建线程的时候传递的参数
	)

挂起线程

DWORD SuspendThread(HANDLE hThread);

唤醒线程

DWORD ResumeThread(HANDLE hThread);

结束指定线程

BOOL TerminateThread(
	HANDLE hThread,
	DWORD dwExitCode
)

结束函数所在的线程

VOID ExitThread(DWORD dwExitCode);

获取当前线程的ID

GetCurrentThreadId(); //获取该函数执行时候在的线程的ID

获取当前线程句柄

GetCurrentThread()

线程结束就是有信号
等候单个句柄有信号(目前只有线程的句柄为等候句柄,窗口句柄都不是)

//等候句柄表示的式 状态分为 有信号和无信号两种的句柄
DWORD WaitForSingleObject(   //阻塞函数,一直等到有信号才返回,
	HANDLE handle,
	DWORD dwMilliseconds    //INFINITE 一直等
);

同时等候多个句柄有信号

DWORD WaitForMutipleObjects(
	DWORD nCount,    		 //句柄的数量
	CONST HANDLE *lpHandles, //句柄的地址  句柄数组指针
	BOOL bWait,              //等候的方式 TRUE 所有的句柄都有信号,才返回;FALSE:只有一个有信号就返回
	DWORD dwMilliseconds     //等候的时间
)