线程池-创建到销毁

创建线程池

Windows提供了一个线程池机制来简化线程池的创建、销毁以及日常管理。调用线程池函数时,系统会为进程创建相应的内核资源,其中一些内核资源在进程终止之前都将一直存在。线程池的开销取决于用法:系统会以进程的名义来分配线程、其他内核对象以及内部数据结构。

创建一个新的线程池需调用函数:

PTP_POOL CreateThreadpool(PVOID reserved);

其中reserved是保留的,应该传入参数为NULL。返回值为创建的线程池值。

为了更好的利用计算机的性能,可以通过系统函数获取到计算机的参数:

创建好线程池之后就可以进行设置线程数量。

以异步方式调用函数

为执行线程池异步调用函数,需要使用下面函数:

VOID NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext);

为了让线程池中的一个线程执行该函数,需要向线程池提交一个请求。

BOOL TrySubThreadpoolCallback(PTP_SIMPLE_CALLBACK pfnCallback, PVOID pvContext, PTP_CALLBAACK_ENVIRON pcbe);

该函数通过将一个工作项添加到线程池的队列中,若调用成功,则返回TRUE,调用失败,则返回FALSE。

创建工作项时需要调用下面函数:

VOID CALLBACK WorkCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work);

向线程池提交请求时,可以使用函数:

VOID SubminThreadpoolWork(PTP_WORK pWork);

如果存在另一个线程想要取消已经提交的工作项,或该线程由于要等待工作项处理完毕而需要将自己挂起,可以使用下面的函数:

VOID WaitForTreadpoolWorkCallbacks(PTP_WORK pWork, BOOL bCancelPendingCallbacks);

不再需要一个工作项时,可以调用下面的函数:

VOID CloseThreadpoolWork(PTP_WORK pwk);

不需要自己调用CreateThread。系统会自动为我们创建一个默认的线程池,并让线程池中的一个线程来调用我们的回调函数。当线程处理完一个请求之后,他不会立刻被销毁,而是会回到线程池中,准备处理队列中的任何其他工作项。线程池会不断地重复使用其中的线程,而不会频繁的创建和销毁线程。

每隔一段时间调用一个函数

每个一段时间进行调用一个函数相当于程序执行任务是基于一个计时器进行执行。如果使用一个可等待的计时器对象会浪费系统资源,只需要创建一个可等待计时器即可。

在内核对象触发时调用一个函数

内核对象触发的时机,请参考如下:
内核对象触发

在异步I/O请求完成时调用一个函数

销毁线程池

当程序需要销毁线程池时,调用下面的函数:

VOID CloseThreadpoolGroupMembers(PTP_CLEANUP_GROUP ptpcg, BOOL bCanclePendingCallbacks, PVOID pvCleanupContext);

当bCanclePendingCallbacks为true时,函数会将已经提交但尚未处理的工作项直接取消。

当所有的工作项被取消或处理之后,调用下面的函数来释放清理组所占用的资源:

VOID WINAPI CloseThreadpoolCleanupGroup(PTP_CLEANUP_GROUP ptpcg);

最后可以调用DestroyThreadpoolEnvironment和CloseThreadpool,这样就完全关闭线程池。

猜你喜欢

转载自blog.csdn.net/qq_37774304/article/details/85839213