CreateIoCompletionPort

本文介绍了一种基于Windows系统的高性能线程池实现方法——完成端口(IOCP)。通过创建消息队列并利用线程等待消息的方式提高系统效率。文章详细展示了CThreadPools类的实现过程,包括初始化、消息处理及线程关闭等功能。

    在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;

};

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值