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 //等候的时间
)