zoukankan      html  css  js  c++  java
  • 转:线程池

    一个简单的片段  
      CThreadPool::CThreadPool()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      m_pThreads[i]=new   CCommandThread;  
      m_pThreads[i]->m_nID=i;  
      m_pThreads[i]->m_pPool=this;  
      }  
      m_pDataThreadPool=NULL;  
      }  
       
      CThreadPool::~CThreadPool()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      m_pThreads[i]->PostThreadMessage(WM_QUIT,NULL,NULL);  
      m_pThreads[i]->ResumeThread();  
      m_pThreads[i]=NULL;  
      }  
      if(m_pDataThreadPool!=NULL)  
      delete   m_pDataThreadPool;  
      m_pDataThreadPool=NULL;  
       
      }  
       
       
      BEGIN_MESSAGE_MAP(CThreadPool,   CWnd)  
      //{{AFX_MSG_MAP(CThreadPool)  
      ON_WM_TIMER()  
      //}}AFX_MSG_MAP  
      END_MESSAGE_MAP()  
       
       
      /////////////////////////////////////////////////////////////////////////////  
      //   CThreadPool   message   handlers  
       
      //创建线程并暂停  
      void   CThreadPool::CreateThreads()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      m_pThreads[i]->CreateThread(CREATE_SUSPENDED);  
      }  
       
      }  
       
      void   CThreadPool::Accept(SOCKET   hSocket)  
      {  
      CCommandThread   *pThread;  
      CCommandSocket   tSocket;  
      CString   IP,Str;  
      UINT   Port;  
      //得到当前可用的线程  
      pThread=GetFreeThread();  
      if(pThread==NULL)  
      {  
      tSocket.Attach(hSocket);  
      tSocket.GetPeerName(IP,Port);  
      Str.Format("因连接过多,来自\"%s:%d\"的连接被拒绝。",IP,Port);  
      SysLog.AddLogItem(Str,LT_SYSTEM);  
      tSocket.SendData(MSG_CONNECTBUSY);  
      tSocket.Close();  
      return;  
      }  
      tSocket.Attach(hSocket);  
      tSocket.GetPeerName(IP,Port);  
      Str.Format("\"%s:%d\"连接到本机。",IP,Port);  
      SysLog.AddLogItem(Str,LT_USER);  
      tSocket.Detach();  
      pThread->m_hSocket=hSocket;  
      pThread->PostThreadMessage(UM_COMMAND,UM_START_WORK,NULL);  
      pThread->ResumeThread();  
      }  
       
      //得到当前空闲的线程  
      CCommandThread*   CThreadPool::GetFreeThread()  
      {  
      int   i;  
      for(i=0;i<MAX_USER_CONNECTION;i++)  
      {  
      if(m_pThreads[i]->m_OnUsing==false)  
      {  
      m_pThreads[i]->m_OnUsing=true;  
      //此处要清理m_pThreads[i]的消息队列,不会做  
      return   m_pThreads[i];  
      }  
      }  
      return   NULL;  
      }  
  • 相关阅读:
    泛型的内部原理:类型擦除以及类型擦除带来的问题
    内部类访问局部变量的时候,为什么变量必须加上final修饰
    Web 测试经验总结
    故障测试
    智能硬件产品的测试经验总结
    web端测试和移动端测试的区别小记
    MVC模式介绍
    重定向与转发
    MySQL权限管理分配
    pt-heartbeat工具监控MySQL复制延迟
  • 原文地址:https://www.cnblogs.com/huking/p/1574447.html
Copyright © 2011-2022 走看看