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