Windows API中线程异步API简介

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 模型的区别:

  1. IOCP 模式:通过完成端口统一处理所有异步 I/O 完成通知,适合高并发服务器
  2. Alertable I/O 模式 :通过 ReadFileEx / WriteFileEx + Alertable Wait 实现回调式异步,适合顺序处理逻辑
相关推荐
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
rockmelodies4 天前
# Windows Server2008 R2 Standard(SP1镜像U盘)重置本地管理员密码【完整详细步骤】
windows·密码破解
kakakahahahaha5 天前
Windows C盘空间不足的安全清理与迁移流程
windows·电脑·笔记本电脑·软件需求·c盘清理
做咩啊~5 天前
远程连接提示:身份验证错误,要求的函数不受支持
windows
百事牛科技5 天前
PPT只读怎么取消?四种情况分别处理
windows·powerpoint
熊明才5 天前
WSL2 网络突然瘫痪(Network is unreachable / 没有 eth0)最短修复指南(2026年9月20日亲测可用)
linux·windows·wsl2
xbzb6 天前
Windows 启动故障修复知识整理:蓝屏 / 无限重启 / 盘符 X / 无 PE 盘
windows
我命由我123456 天前
Mac 操作系统 - 一些使用记录
运维·windows·学习·系统安全·运维开发·mac·学习方法
kakakahahahaha6 天前
Windows Steam 游戏存档在哪里?定位和恢复排查流程
windows·其他·电脑·笔记本电脑·内容运营·软件需求
Xy-unu6 天前
Windows 开启外接显示器 HDR 后外接显示器无信号、无法扩展模式故障记录
windows