线程池完整实例代码 MFC
时间: 2023-10-17 18:07:25 浏览: 154
Visual C++写的线程池的例子threadmanage.rar
以下是一个基于 MFC 的线程池完整实例代码:
首先,定义一个任务类 CTask,它包含一个虚函数 Run,用于执行具体的任务。这个虚函数需要在派生类中实现。
```c++
class CTask
{
public:
virtual void Run() = 0;
};
```
然后,定义一个线程池类 CThreadPool,它包含一个任务队列和一组工作线程。线程池的主要作用是将任务添加到任务队列中,并从队列中取出任务分配给工作线程执行。
```c++
class CThreadPool
{
public:
CThreadPool(int nMaxThreads = 4);
virtual ~CThreadPool();
void AddTask(CTask* pTask);
protected:
static UINT WINAPI WorkerThread(LPVOID lpParam);
void CreateThreads();
CTask* GetTask();
CRITICAL_SECTION m_cs;
HANDLE m_hSemaphore;
std::queue<CTask*> m_TaskQueue;
std::vector<HANDLE> m_vecThreadHandles;
bool m_bStop;
int m_nMaxThreads;
};
```
在线程池类的构造函数中,我们初始化了信号量和临界区,并创建了指定数量的工作线程。在 AddTask 函数中,我们将任务添加到任务队列中,执行过程中需要加锁保证线程安全。在 GetTask 函数中,我们从任务队列中取出一个任务,如果队列为空,就等待信号量。在 WorkerThread 函数中,每个工作线程都会不断地从任务队列中取出任务执行。
```c++
CThreadPool::CThreadPool(int nMaxThreads)
: m_hSemaphore(NULL), m_bStop(false), m_nMaxThreads(nMaxThreads)
{
InitializeCriticalSection(&m_cs);
m_hSemaphore = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
CreateThreads();
}
CThreadPool::~CThreadPool()
{
m_bStop = true;
ReleaseSemaphore(m_hSemaphore, m_nMaxThreads, NULL);
WaitForMultipleObjects(m_vecThreadHandles.size(), &m_vecThreadHandles[0], TRUE, INFINITE);
for (std::vector<HANDLE>::iterator it = m_vecThreadHandles.begin(); it != m_vecThreadHandles.end(); ++it)
{
CloseHandle(*it);
}
CloseHandle(m_hSemaphore);
DeleteCriticalSection(&m_cs);
}
void CThreadPool::AddTask(CTask* pTask)
{
EnterCriticalSection(&m_cs);
m_TaskQueue.push(pTask);
ReleaseSemaphore(m_hSemaphore, 1, NULL);
LeaveCriticalSection(&m_cs);
}
void CThreadPool::CreateThreads()
{
for (int i = 0; i < m_nMaxThreads; ++i)
{
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, WorkerThread, this, 0, NULL);
m_vecThreadHandles.push_back(hThread);
}
}
CTask* CThreadPool::GetTask()
{
CTask* pTask = NULL;
EnterCriticalSection(&m_cs);
if (!m_TaskQueue.empty())
{
pTask = m_TaskQueue.front();
m_TaskQueue.pop();
}
LeaveCriticalSection(&m_cs);
return pTask;
}
UINT WINAPI CThreadPool::WorkerThread(LPVOID lpParam)
{
CThreadPool* pThreadPool = (CThreadPool*)lpParam;
while (!pThreadPool->m_bStop)
{
CTask* pTask = pThreadPool->GetTask();
if (pTask != NULL)
{
pTask->Run();
delete pTask;
}
else
{
WaitForSingleObject(pThreadPool->m_hSemaphore, INFINITE);
}
}
return 0;
}
```
最后,我们来看一下如何使用线程池。首先创建一个派生自 CTask 的任务类,实现 Run 函数。然后创建一个线程池对象,并向其中添加任务。任务会被自动分配给工作线程执行。
```c++
class CMyTask : public CTask
{
public:
virtual void Run()
{
// do some work
}
};
int main()
{
CThreadPool threadPool;
for (int i = 0; i < 10; ++i)
{
CMyTask* pTask = new CMyTask();
threadPool.AddTask(pTask);
}
return 0;
}
```
阅读全文