bool CThreadPoolExecutor::Init(unsigned int minThreads, unsigned int maxThreads, unsigned int maxPendingTasks) { if (minThreads == 0) { return false; } if (maxThreads < minThreads) { return false; } m_minThreads = minThreads; m_maxThreads = maxThreads; m_maxPendingTasks = maxPendingTasks; unsigned int i = m_ThreadPool.size(); for (; i<minThreads; i++) { //创建线程 CWorker * pWorker = new CWorker(this); if (NULL == pWorker) { return false; } EnterCriticalSection(&m_csThreadPoolLock); m_ThreadPool.insert(pWorker); LeaveCriticalSection(&m_csThreadPoolLock); pWorker->Start(); } m_bRun = true; m_bEnableInsertTask = true; return true; }
bool CNppThreadPool::Initialize(unsigned int minThreads, unsigned int maxThreads) { if (m_bInitialized) return false; if(minThreads <= 0) { minThreads = 1; } if(maxThreads < minThreads) { return false; } m_minThreads = minThreads; m_maxThreads = maxThreads; unsigned int i = _GetCurrentThreadPoolSize(); for(; i<minThreads; i++) { //create thread workers CWorker * pWorker = new(std::nothrow) CWorker(this); if(NULL == pWorker) { return false; } pWorker->Start(); _WorkerJumpIntoPool(pWorker); } m_bInitialized = true; m_bRun = true; m_bEnableInsertTask = true; return true; }
bool CThreadPoolExecutor::Execute(Runnable * pRunnable) { if (!m_bEnableInsertTask) { return false; } if (NULL == pRunnable) { return false; } if (m_Tasks.size() >= m_maxPendingTasks) { if (m_ThreadPool.size() < m_maxThreads) { CWorker * pWorker = new CWorker(this, pRunnable); if (NULL == pWorker) { return false; } EnterCriticalSection(&m_csThreadPoolLock); m_ThreadPool.insert(pWorker); LeaveCriticalSection(&m_csThreadPoolLock); pWorker->Start(); } else { return false; } } else { EnterCriticalSection(&m_csTasksLock); m_Tasks.push_back(pRunnable); LeaveCriticalSection(&m_csTasksLock); } return true; }