65.9K
CodeProject 正在变化。 阅读更多。
Home

兼容Win32和pthreads API的线程池

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (8投票s)

2002年3月2日

CPOL

2分钟阅读

viewsIcon

198750

downloadIcon

3109

一个跨平台线程池实现。

引言

我需要创建一个可以在 Windows 和 Linux 平台上运行的服务器。服务器的基本要求之一是高效的线程池方案。我遇到了 pthreads API。我已经有一个使用 IO 完成端口的线程池方案。通过使用一些定义和预处理器指令,我将现有的线程池修改为支持 pthread 库。我尚未在 Linux 上编译过此代码。

要求

它使用了 STL 容器 vectordeque

它还使用了 STL 算法 for_each
这些类本身不使用 MFC,但演示应用程序是使用 MFC 单文档应用程序向导创建的。
在非 Win32 平台上需要 pthreads 库。

使用方法

要使用本机 Win32 API,请注释掉 header 文件 'defines.h' 中的一行。

#include <pthread/pthread.h&>

第一步:包含 header 文件 thread.h

第二步:从 ThreadJob 派生一个类 CMyJob 并实现 'execute' 虚拟函数。在线程中要执行的任务完成后,不要忘记调用基类的 'execute' 函数。

第三步:在应用程序的初始化中,调用

CThread::get_threadpool().start(num);

这将创建线程并等待它们。

第四步:当您有需要在池中排队执行的任务时,

CMyJob* pjob = new CMyJob
// initialize pjob

CThread::get_threadpool().add_job(pjob);

线程池执行该任务,任务完成后,CMyJob 会自行删除。

第五步:当应用程序退出时,调用

CThread::get_threadpool().stop();

这将阻止排队更多任务,删除待处理的任务,停止线程然后返回。

您可以从 ftp://sources.redhat.com/pub/pthreads-win32/dll-latest 获取 pthreads 库以进行测试。

在我的测试中,Win32 上的 pthreads 比 Win32 慢一点。这可能是因为 Win32 上的 pthreads 是对本机 Win32 线程 API 的封装。

请发送任何改进此类的建议。

© . All rights reserved.