WPUQueueApc 函数 (ws2spi.h)
WPUQueueApc 函数将用户模式异步过程调用 (APC) 排队到指定线程,以便于调用重叠的 I/O 完成例程。
语法
int WPUQueueApc(
[in] LPWSATHREADID lpThreadId,
[in] LPWSAUSERAPC lpfnUserApc,
[in] DWORD_PTR dwContext,
[out] LPINT lpErrno
);
参数
[in] lpThreadId
指向标识线程上下文的 WSATHREADID 结构的指针。 指向此结构的指针由 Ws2_32.dll 作为重叠操作的输入参数提供给服务提供程序。 提供程序应在本地存储 WSATHREADID 结构,并提供指向此本地存储的指针。 WPUQueueApc 返回后,不再需要 WSATHREADID 的本地副本。
[in] lpfnUserApc
指向要调用的 APC 函数的指针。
[in] dwContext
随后作为输入参数提供给 APC 函数的 32 位上下文值。
[out] lpErrno
指向错误代码的指针。
返回值
如果未发生错误, WPUQueueApc 将返回零,并将指定线程的完成例程排入队列。 否则,它将返回SOCKET_ERROR,并且 lpErrno 中提供了特定的错误代码。
错误代码 | 含义 |
---|---|
dwThreadId 参数未指定有效的线程。 |
注解
此函数针对指定的线程将 APC 函数排队。 在 Windows 下,将使用用户模式异步过程调用 (APC) 完成此操作。 仅当指定线程在可警报等待中被阻止时,APC 才会执行,并且将直接进行回调。 此调用在中断上下文中是安全的。
LPWSAUSERAPC 的定义如下:
typedef void ( CALLBACK FAR * LPWSAUSERAPC )( DWORD dwContext );
由于 APC 机制仅支持单个上下文值, 因此 lpfnUserApc 本身不能是客户端指定的完成例程,这涉及到更多参数。 服务提供程序必须改为提供指向其自己的 APC 函数的指针,该函数使用提供的 dwContext 值访问重叠操作所需的结果信息,然后调用客户端指定的完成例程。
对于用户模式组件实现重叠 I/O 的服务提供商,APC 机制的典型用法如下所示。
-
- 当 I/O 操作完成时,提供程序分配一个小缓冲区,并将其与指向客户端提供的完成过程的指针和要传递给该过程的参数值打包。
- 它将 APC 排队,将指向缓冲区的指针指定为 dwContext 值,将自己的中间过程指定为目标过程 lpfnUserApc。
- 当目标线程最终进入可警报等待状态时,在正确的线程上下文中调用服务提供程序的中间过程。
- 中间过程只需解压缩参数、解除分配缓冲区并调用客户端提供的完成过程。
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | ws2spi.h |