QueueUserWorkItem 函数 (threadpoollegacyapiset.h)
将工作项排队到 线程池中的工作线程。
语法
BOOL QueueUserWorkItem(
[in] LPTHREAD_START_ROUTINE Function,
[in, optional] PVOID Context,
[in] ULONG Flags
);
参数
[in] Function
指向应用程序定义的回调函数的指针,类型 LPTHREAD_START_ROUTINE 由线程池中的线程执行。 此值表示线程的起始地址。 此回调函数不得调用 TerminateThread 函数。
不使用回调函数的返回值。
有关详细信息,请参阅 ThreadProc。
[in, optional] Context
要传递给线程函数的单个参数值。
[in] Flags
控制执行的标志。 此参数可使用以下一个或多个值。
值 | 含义 |
---|---|
|
默认情况下,回调函数将排队到非 I/O 工作线程。
回调函数将排队到使用 I/O 完成端口的线程,这意味着它们无法执行可警报等待。 因此,如果 I/O 完成并生成 APC,APC 可能会无限期等待,因为不能保证线程会在回调完成后进入可警报等待状态。 |
|
未使用此标志。
Windows Server 2003 和 Windows XP: 回调函数排队到 I/O 工作线程。 如果应在处于可警报状态等待的线程中执行函数,则应使用此标志。 从 Windows Vista 和 Windows Server 2008 开始删除 I/O 工作线程。 |
|
回调函数将排队到永不终止的线程。 它不保证每次都使用相同的线程。 此标志应仅用于短任务,否则可能会影响其他计时器操作。
如果线程调用使用 APC 的函数,则必须设置此标志。 有关详细信息,请参阅 异步过程调用。 请注意,目前没有工作线程真正持久化,但如果有任何挂起的 I/O 请求,则工作线程不会终止。 |
|
回调函数可以执行长时间的等待。 此标志可帮助系统确定是否应创建新线程。 |
|
回调函数将使用当前访问令牌,无论是进程令牌还是模拟令牌。 如果未指定此标志,则回调函数仅使用进程令牌执行。
Windowsxp: 在 Windows XP SP2 和 Windows Server 2003 之前,不支持此标志。 |
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
如果 DLL 中的函数已排队到工作线程,请确保该函数在卸载 DLL 之前已完成执行。
默认情况下,线程池每个进程最多有 512 个线程。 若要提高队列限制,请使用 WinNT.h 中定义的 WT_SET_MAX_THREADPOOL_THREAD 宏。
#define WT_SET_MAX_THREADPOOL_THREADS(Flags,Limit) \
((Flags)|=(Limit)<<16)
在调用 QueueUserWorkItem 时使用此宏指定 Flags 参数。 宏参数是所需的标志和新限制,最多 (2<<16) -1 线程。 但是,队列的大小受内核非分页池的大小限制。 请注意,应用程序可以通过保持较低的工作线程数来提高其性能。
若要编译使用此函数的应用程序, 请将_WIN32_WINNT 定义为 0x0500 或更高版本。 有关详细信息,请参阅 使用 Windows 标头。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | threadpoollegacyapiset.h (包括 Windows Server 2003 上的 Windows.h、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
Library | Kernel32.lib |
DLL | Kernel32.dll |