第十九章 Windows 平台下线程的使用

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值