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 实现回调式异步,适合顺序处理逻辑
相关推荐
私人珍藏库2 小时前
[Windows] 绘画工具 Krita v5.3.1
人工智能·windows·媒体·工具·软件·多功能
tumeng07116 小时前
Node.JS 版本管理工具 Fnm 安装及配置(Windows)
windows·node.js
阿正的梦工坊7 小时前
Mac 的.zshrc在 Windows 上等价怎么做:设置环境变量
windows·macos
csdn2015_7 小时前
List<DocumentMetadata> 取所有docid,组成List<String>
windows·python·list
牢七8 小时前
CVE-2022-37202 nday 研究 sql
linux·windows·microsoft
冰冷的希望8 小时前
【系统】非虚拟机,物理机安装Ubuntu教程,Windows与Linux(Ubuntu)双系统共存!
linux·windows·ubuntu·系统架构·vmware·双系统·pe系统
诸葛大钢铁10 小时前
Java实现Excel文件合并
java·windows·excel
习惯就好zz10 小时前
记一次 Mac SSH 免密登录 Windows 的踩坑与修复
windows·macos·ssh
csdn2015_10 小时前
Set<String> 类型取第一条记录
开发语言·windows·python