Windows 中线程创建的方式
#inlcude <windows.h>
HANDLE CreateThread(
LPSECURUTY_ATTRIBUTES lpThreadAttributes, //线程安全相关信息,使用默认设置时传递NULL
SIZE_T dwStackSize, //分配给线程的栈大小,传递0即使用默认栈大小
LPTHREAD_START_ROUTINE lpStartAddress, //传递线程的main函数信息
LPVOID lpParameter, //调用main函数时,传递的参数信息
DWORD dwCreationFlags, //用于指定线程创建后的行为,传递0时,线程创建后立即进入可执行状态
LPDWORD lpThreadId //用于保存线程ID的变量地址值
};
// 成功时返回线程句柄,失败时返回NULL
创建 “使用线程安全标准 C 函数” 的线程
因为CreateThread函数创建的线程在调用C/C++标准函数时并不稳定。
#include <process.h>
uintptr_t _beginthreadx(
void *security,
unsigned stack_size,
unsigned (*start_address)(void*),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
};
// 成功时返回线程句柄,失败时返回0
该函数与CreateThread函数相比较,参数个数及各参数的含义和顺序均相同,只是变量名和类型有所不同。
内核对象的两种状态
资源类型不同,内核对象也含有不同信息。例如,线程内核对象中需要重点关注线程是否已终止,所以终止状态又称为 “signaled状态”,未终止状态称为 “non-signaled状态”。
为判断内核对象当前是否为signaled状态,系统定义了WaitForSingleObject 和 WaitForMultipleObjects函数。
WaitForSingleObject & WaitForMultipleObjects
#include <windows.h>
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
// 成功时返回事件信息,失败时返回WAIT_FAILED
// hHandle - 查看状态的内核对象句柄
// dwMilliseconds - 以1/1000秒为单位指定超时,传递INFINITE时函数不会返回,直到内核对象变成signaled状态
// 返回值 - 进入signaled状态返回WAIT_OBJECT_0,超时返回WAIT_TIMEOUT
#include <windows.h>
DWORD WaitForMultipleObjects(
DWORD nCount, //需验证的内核对象数
const HANDLE *lpHandles, //存有内核对象句柄的数组地址值
BOOL bWaitAll, //如果为TRUE,则所有内核对象全部线程signaled时返回;如果为FALSE,则只要有一个验证对象的状态变成signaled就会返回
DWORD dwMilliseconds //以1/1000秒为单位指定超时,传递INFINITE时函数不会返回,直到内核对象变成signaled状态
)
// 成功时返回事件信息,失败时返回WAIT_FAILED