#include "StdAfx.h" #include "IOCPHandler.h" #include typedef unsigned (__stdcall *PTHREAD_START) (void *); #define BEGINTHREADEX(psa, cbStack, pfnStartAddr, \ pvParam, fdwCreate, pdwThreadId) \ ((HANDLE)_beginthreadex( \ (void *) (psa), \ (unsigned) (cbStack), \ (PTHREAD_START) (pfnStartAddr), \ (void *) (pvParam), \ (unsigned) (fdwCreate), \ (unsigned *) (pdwThreadId))) CIOCPHandler::CIOCPHandler(void) { m_hIOCP=NULL; m_nLiveThreadNum = 0; m_nCreatedThreadNumber = 0; m_EventExitWorkerThread = NULL; } CIOCPHandler::~CIOCPHandler(void) { if(m_hIOCP) { CloseHandle(m_hIOCP); m_hIOCP = NULL; } if(m_EventExitWorkerThread) { CloseHandle(m_EventExitWorkerThread); m_EventExitWorkerThread = NULL; } } /*! * \brief * IOCP »ý¼º ¹× ÃʱâÈ­ * * \param nMaxNumberOfConcurrentThreads * Concurrent Thread ÀÇ °¹¼ö * * \param pnOutErrCode * ¿¡·¯ »óȲ ½Ã¿¡ ¿ÜºÎ·Î ´øÁ®Áú ¿¡·¯ÄÚµå, NULL ÀÌ µé¾î¿À¸é ¿¡·¯Äڵ带 ´øÁöÁö ¾Ê´Â´Ù. * * \returns * ¼º°ø = TRUE, ½ÇÆÐ = FALSE */ BOOL CIOCPHandler::Create(int nMaxNumberOfConcurrentThreads, int* pnOutErrCode) { m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nMaxNumberOfConcurrentThreads); if(m_hIOCP == NULL && pnOutErrCode != NULL) { *pnOutErrCode = GetLastError(); } return (m_hIOCP!=NULL); } /*! * \brief * Thread Pool À» »ý¼º! * * \param piProcessThread * IIocpProcessThread ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹ÞÀº Ŭ·¡½º¿¡ ´ëÇÑ Æ÷ÀÎÅÍ.\n * Áï ¾²·¹µå Ç®¿¡ µé¾î°¥ ¾²·¹µå ÇÔ¼ö°¡ ±¸ÇöµÈ Ŭ·¡½ºÀÇ Æ÷ÀÎÅÍ * * \param nNumOfPooledThread * Ç®¸µÇÒ ¾²·¹µå °³¼ö, 0ÀÌ¸é µðÆúÆ® °ª¿¡ ¸ÂÃß¾îÁü * * \returns * TRUE * * * IOCP Worker Thread Ç®À» ¸¸µë * */ BOOL CIOCPHandler::CreateThreadPool(IIOCPProcessThread* piProcessThread, int nNumOfPooledThread) { assert(piProcessThread); assert(nNumOfPooledThread >= 0); if(nNumOfPooledThread == 0) { SYSTEM_INFO si; GetSystemInfo(&si); // µðÆúÆ® ¾²·¹µå ¼ö·Î // 2 * ÇÁ·Î¼¼¼­¼ö + 1 ÀÇ °ø½ÄÀ» µû¶úÀ½ m_nCreatedThreadNumber = si.dwNumberOfProcessors * 2 + 1; } else { m_nCreatedThreadNumber = nNumOfPooledThread; } DWORD dwThreadId; for(int i=0; i < m_nCreatedThreadNumber; i++) { dwThreadId = 0; HANDLE hWorker = CreateThread(NULL, 0, IocpWorkerThreadStartingPoint, piProcessThread, 0, &dwThreadId); CloseHandle(hWorker); hWorker = NULL; // ÇöÀç »ì¾ÆÀÖ´Â ¾²·¹µåÀÇ °³¼ö¸¦ ÆÄ¾ÇÇϱâ À§ÇØ µ¿±âÈ­ °´Ã¼¸¦ µÒ InterlockedIncrement(&m_nLiveThreadNum); } // ¿öÄ¿¾²·¹µåÀÇ Á¾·á È®ÀÎ À̺¥Æ® ÃʱâÈ­ m_EventExitWorkerThread = CreateEvent(NULL, TRUE, FALSE, NULL); return TRUE; } /*! * \brief * IOCP ¿öÄ¿ ¾²·¹µå ½ÃÀÛ Æ÷ÀÎÆ®·Î¼­¸¸ÀÇ ¿ªÈ° * * \param pvParam * IIOCPProcessThread* * * \returns * 0 : ¼º°ø * */ DWORD __stdcall CIOCPHandler::IocpWorkerThreadStartingPoint(PVOID pvParam) { IIOCPProcessThread* piProcessThread=(IIOCPProcessThread*)pvParam; piProcessThread->ProcessingThread(); return 0; } /*! * \brief * ÇöÀç µ¹°í ÀÖ´Â ¾²·¹µå ¸ðµÎ Á×ÀÓ * * * ÇöÀç »ý¼ºµÈ IOCP Ç®À» Ž»öÇÏ¿© IOCP ¿öÄ¿¾²·¹µå¿¡ Á¾·á ¸Þ¼¼Áö¸¦ Àü´ÞÇÑ´Ù. * */ void CIOCPHandler::CloseAllThreads(void) { //TRACE("!---- Start -- void CIOCPHandler::CloseAllThreads(void)! Thread Num = [%d]\n",m_nCreatedThreadNumber); for(int i=0;i