Windows API中线程异步API简介
1. 传统线程池 API (Windows 2000+)
| 函数 | 说明 |
|---|---|
QueueUserWorkItem |
将工作项提交到线程池,由线程池中的线程异步执行 |
BindIoCompletionCallback |
将异步 I/O 操作绑定到线程池,I/O 完成后由线程池线程执行回调 |
RegisterWaitForSingleObject |
注册等待对象,当内核对象被触发或超时时,由线程池线程执行回调 |
2. 线程池 API (Windows Vista/Server 2008+ 新架构)
线程池管理
| 函数 | 说明 |
|---|---|
CreateThreadpool |
创建线程池 |
SetThreadpoolThreadMinimum |
设置线程池最小线程数 |
SetThreadpoolThreadMaximum |
设置线程池最大线程数 |
CloseThreadpool |
关闭线程池 |
工作对象
| 函数 | 说明 |
|---|---|
CreateThreadpoolWork |
创建工作对象 |
SubmitThreadpoolWork |
提交工作到线程池 |
WaitForThreadpoolWorkCallbacks |
等待工作回调完成 |
CloseThreadpoolWork |
关闭工作对象 |
TrySubmitThreadpoolCallback |
简化版提交回调(无需显式创建工作对象) |
等待对象
| 函数 | 说明 |
|---|---|
CreateThreadpoolWait |
创建等待对象 |
SetThreadpoolWait |
设置等待的内核对象 |
WaitForThreadpoolWaitCallbacks |
等待等待对象回调完成 |
CloseThreadpoolWait |
关闭等待对象 |
定时器对象
| 函数 | 说明 |
|---|---|
CreateThreadpoolTimer |
创建定时器对象 |
SetThreadpoolTimer |
设置定时器 |
WaitForThreadpoolTimerCallbacks |
等待定时器回调完成 |
CloseThreadpoolTimer |
关闭定时器对象 |
I/O 完成对象
| 函数 | 说明 |
|---|---|
CreateThreadpoolIo |
创建 I/O 完成对象 |
StartThreadpoolIo |
开始 I/O 操作 |
CancelThreadpoolIo |
取消 I/O 操作 |
WaitForThreadpoolIoCallbacks |
等待 I/O 回调完成 |
CloseThreadpoolIo |
关闭 I/O 对象 |
清理组
| 函数 | 说明 |
|---|---|
CreateThreadpoolCleanupGroup |
创建清理组 |
CloseThreadpoolCleanupGroup |
关闭清理组 |
CloseThreadpoolCleanupGroupMembers |
关闭清理组所有成员 |
回调环境
| 函数 | 说明 |
|---|---|
InitializeThreadpoolEnvironment |
初始化回调环境 |
DestroyThreadpoolEnvironment |
销毁回调环境 |
SetThreadpoolCallbackPool |
设置回调使用的线程池 |
SetThreadpoolCallbackCleanupGroup |
设置回调清理组 |
SetThreadpoolCallbackRunsLong |
标记回调运行时间较长 |
3. 线程管理函数
| 函数 | 说明 |
|---|---|
CreateThread |
创建新线程(基础线程创建函数) |
CreateRemoteThread |
在远程进程中创建线程 |
ExitThread |
退出当前线程 |
TerminateThread |
终止指定线程 |
SuspendThread |
挂起线程 |
ResumeThread |
恢复线程 |
GetExitCodeThread |
获取线程退出码 |
4. 线程同步与异步执行辅助函数
| 函数 | 说明 |
|---|---|
Sleep / SleepEx |
线程睡眠(Ex 版本支持 alertable 等待) |
WaitForSingleObject / WaitForSingleObjectEx |
等待单个对象 |
WaitForMultipleObjects / WaitForMultipleObjectsEx |
等待多个对象 |
QueueUserAPC |
向线程队列添加异步过程调用 (APC) |
SwitchToThread |
切换到其他等待线程 |
5.Windows API 的异步机制还包括 I/O 完成端口 (IOCP) 和 异步 I/O (Overlapped I/O) 相关函数
1. I/O 完成端口 (IOCP) 核心函数
| 函数 | 说明 |
|---|---|
CreateIoCompletionPort |
创建 I/O 完成端口,或将文件/套接字句柄关联到现有完成端口 |
GetQueuedCompletionStatus |
从完成端口队列中获取完成的 I/O 操作状态(阻塞等待) |
GetQueuedCompletionStatusEx |
批量获取完成状态(Windows Vista+,支持同时获取多个完成包) |
PostQueuedCompletionStatus |
手动向完成端口投递完成包(用于线程间通信、发送退出信号等) |
2. 重叠 I/O (Overlapped I/O) 核心函数
基础异步 I/O
| 函数 | 说明 |
|---|---|
ReadFile |
异步读取文件(需传入 OVERLAPPED 结构,使用 FILE_FLAG_OVERLAPPED 标志打开文件) |
WriteFile |
异步写入文件(同上) |
ReadFileEx |
异步读取文件(使用回调函数通知完成,支持 Alertable I/O) |
WriteFileEx |
异步写入文件(同上) |
DeviceIoControl |
异步设备控制操作 |
重叠结果查询
| 函数 | 说明 |
|---|---|
GetOverlappedResult |
获取重叠 I/O 操作的结果(阻塞或非阻塞查询) |
GetOverlappedResultEx |
支持超时参数的重叠结果查询(Windows Vista+) |
HasOverlappedIoCompleted |
检查重叠 I/O 是否已完成(宏或内联函数) |
3. Windows Sockets 异步 I/O 函数
| 函数 | 说明 |
|---|---|
WSASend |
异步发送数据(重叠 I/O) |
WSARecv |
异步接收数据(重叠 I/O) |
WSASendTo |
异步发送数据到指定地址(UDP) |
WSARecvFrom |
异步接收数据并获取源地址(UDP) |
WSAConnectByName / WSAConnectByList |
异步连接(Windows Vista+) |
AcceptEx |
异步接受连接(扩展函数,需 mswsock.h) |
WSAConnectEx |
异步建立连接(扩展函数) |
DisconnectEx |
异步断开连接(扩展函数) |
TransmitFile |
异步文件传输(零拷贝) |
TransmitPackets |
异步数据包传输 |
4. 取消异步 I/O 操作
| 函数 | 说明 |
|---|---|
CancelIo |
取消指定句柄上由当前线程发起的所有异步 I/O(仅当前线程) |
CancelIoEx |
取消指定句柄上的所有异步 I/O(可取消其他线程发起的操作,Windows Vista+) |
CancelSynchronousIo |
取消指定的同步 I/O 操作(Windows Vista+) |
5. Alertable I/O 等待函数
使用 ReadFileEx / WriteFileEx 时,需要通过 Alertable Wait 函数等待回调执行:
表格
| 函数 | 说明 |
|---|---|
SleepEx |
可警报的睡眠(TRUE 参数使其进入 Alertable 状态) |
WaitForSingleObjectEx |
可警报的单对象等待 |
WaitForMultipleObjectsEx |
可警报的多对象等待 |
WaitForMultipleObjects |
等待多个对象(Ex 版本支持 Alertable) |
MsgWaitForMultipleObjectsEx |
消息和对象等待(支持 Alertable) |
SignalObjectAndWait |
信号对象并等待(Ex 版本支持 Alertable) |
6. 文件句柄创建标志
使用异步 I/O 时,创建文件/套接字需要指定特定标志:
表格
| 标志/函数 | 说明 |
|---|---|
FILE_FLAG_OVERLAPPED |
CreateFile 标志,启用文件的重叠 I/O 模式 |
WSA_FLAG_OVERLAPPED |
WSASocket 标志,启用套接字重叠 I/O 模式 |
关键数据结构
表格
| 结构体 | 说明 |
|---|---|
OVERLAPPED |
重叠 I/O 的核心结构,包含事件句柄、偏移量和 I/O 状态 |
OVERLAPPED_ENTRY |
用于 GetQueuedCompletionStatusEx 的批量完成条目 |
两种异步 I/O 模型的区别:
- IOCP 模式:通过完成端口统一处理所有异步 I/O 完成通知,适合高并发服务器
- Alertable I/O 模式 :通过
ReadFileEx/WriteFileEx+ Alertable Wait 实现回调式异步,适合顺序处理逻辑