在Windows系统里,使用完成端口是高性能的方法之一,比如把完成端口使用到线程池和网络服务器里。现在就通过线程池的方法来介绍怎么样使用完成端 口,高性能的服务器以后再仔细地介绍怎么样构造它。其实完成端口是一个队列,所有的线程都在等消息出现,如果队列里有消息,就每个线程去获取一个消息执行 它。先用函数CreateIoCompletionPort来创建一个消息队列,然后使用GetQueuedCompletionStatus函数来从队 列获取消息,使用函数PostQueuedCompletionStatus来向队列里发送消息。通过这三个函数就实现完成端口的消息循环处理。
#pragma once
#include "Thread.h"
//使用IOCP实现线程池。
class CThreadPools
{
public:
CThreadPools(void)
{
m_nThreadCount = 2;
}
~CThreadPools(void)
{
}
bool Init(void)
{
//创建一个IOCP。
m_hQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, m_nThreadCount);
if (m_hQueue == NULL)
{
//创建IOCP失败。
return false;
}
}
int GetThreadCount(void) const
{
return m_nThreadCount;
}
//线程池处理的内容。
DWORD Run(void)
{
DWORD dwBytesTransfered;
ULONG_PTR dwCompletionKey;
OVERLAPPED* pOverlapped;
//等一个IOCP的消息。
while (GetQueuedCompletionStatus(m_hQueue, &dwBytesTransfered, &dwCompletionKey, &pOverlapped, INFINITE))
{
if (pOverlapped == ((OVERLAPPED*) ((__int64) -1)) )
{
//退出。
OutputDebugString(_T("退出 /r/n"));
break;
}
else
{
WPARAM request = (WPARAM) dwCompletionKey;
//处理消息。
OutputDebugString(_T("GetQueuedCompletionStatus /r/n"));
}
}
return 0;
}
//发送处理的消息。
bool QueueRequest(WPARAM wParam)
{
//往IOCP里发送一条消息。
if (!PostQueuedCompletionStatus(m_hQueue, 0, (ULONG_PTR) wParam, NULL))
{
return false;
}
return true;
}
//关闭所有线程。
void Close(void)
{
for (int i = 0; i < m_nThreadCount; i++)
{
PostQueuedCompletionStatus(m_hQueue, 0, 0, (OVERLAPPED*) ((__int64) -1) );
}
}
protected:
//接收消息处理的队列。
HANDLE m_hQueue;
//线程个数。
int m_nThreadCount;
};
//////////////////////////////////////////////////////////////////////////
class CThreads :
public CThread
{
public:
Threads(CThreadPools* pPool)
{
m_pPool = pPool;
}
virtual ~CThreads(void)
{
}
protected:
//
//线程运行函数。
//在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
//蔡军生 2007/10/29
virtual DWORD Run(void)
{
//
if (m_pPool)
{
return m_pPool->Run();
}
return -1;
}
protected:
CThreadPools* m_pPool;
};
本文介绍了一种基于Windows系统的高性能线程池实现方法——完成端口(IOCP)。通过创建消息队列并利用线程等待消息的方式提高系统效率。文章详细展示了CThreadPools类的实现过程,包括初始化、消息处理及线程关闭等功能。

被折叠的 条评论
为什么被折叠?



