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

控制执行的标志。 此参数可使用以下一个或多个值。

含义
WT_EXECUTEDEFAULT
0x00000000
默认情况下,回调函数将排队到非 I/O 工作线程。

回调函数将排队到使用 I/O 完成端口的线程,这意味着它们无法执行可警报等待。 因此,如果 I/O 完成并生成 APC,APC 可能会无限期等待,因为不能保证线程会在回调完成后进入可警报等待状态。

WT_EXECUTEINIOTHREAD
0x00000001
未使用此标志。

Windows Server 2003 和 Windows XP: 回调函数排队到 I/O 工作线程。 如果应在处于可警报状态等待的线程中执行函数,则应使用此标志。

从 Windows Vista 和 Windows Server 2008 开始删除 I/O 工作线程。

WT_EXECUTEINPERSISTENTTHREAD
0x00000080
回调函数将排队到永不终止的线程。 它不保证每次都使用相同的线程。 此标志应仅用于短任务,否则可能会影响其他计时器操作。

如果线程调用使用 APC 的函数,则必须设置此标志。 有关详细信息,请参阅 异步过程调用

请注意,目前没有工作线程真正持久化,但如果有任何挂起的 I/O 请求,则工作线程不会终止。

WT_EXECUTELONGFUNCTION
0x00000010
回调函数可以执行长时间的等待。 此标志可帮助系统确定是否应创建新线程。
WT_TRANSFER_IMPERSONATION
0x00000100
回调函数将使用当前访问令牌,无论是进程令牌还是模拟令牌。 如果未指定此标志,则回调函数仅使用进程令牌执行。

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

另请参阅

进程和线程函数

线程池

ThreadProc