blob: 2c7e3ff1b27a7b18ce24f8c54765d5a721a64373 [file]
/**
* Copyright (C) 2013 kangliqiang ,kangliq@163.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __KPR_THREADPOOL_H__
#define __KPR_THREADPOOL_H__
#include<time.h>
#include <assert.h>
#include <list>
#include "Mutex.h"
#include "Thread.h"
#include "Monitor.h"
#include "ThreadPoolWork.h"
namespace kpr
{
const int MAX_THREAD_COUNT = 300;
const int MIN_THREAD_COUNT = 1;
//const int MAX_IDLE_THREAD_TIME = 600000;
const int MAX_IDLE_THREAD_TIME = 0;
const int THREAD_STEP = 10;
const int CHECK_IDLE_THREADS_INTERVAL = 30000;
class ThreadPool;
class ThreadPoolWorker : public kpr::Thread, public kpr::Monitor
{
public:
ThreadPoolWorker(ThreadPool* pThreadPool, const char* strName);
virtual void Run();
void WakeUp();
void Stop();
bool IsWaiting();
bool IsIdle();
void SetIdle(bool idle);
int IdleTime(int idleTime);
private:
ThreadPool* m_pThreadPool;
bool m_canWork;
bool m_isWaiting;
bool m_stop;
int m_idleTime;
bool m_idle;
};
typedef kpr::RefHandleT<ThreadPoolWorker> ThreadPoolWorkerPtr;
class ThreadPoolManage : public kpr::Thread, public kpr::Monitor
{
public:
ThreadPoolManage(const char* name, ThreadPool* pThreadPool, int nCheckldleThreadsInterval);
~ThreadPoolManage();
virtual void Run();
void Stop();
private:
ThreadPool* m_pThreadPool;
bool m_stop;
int m_checkIdleThreadsInterval;
};
typedef kpr::RefHandleT<ThreadPoolManage> ThreadPoolManagePtr;
class ThreadPool : public kpr::RefCount, public kpr::Monitor
{
public:
ThreadPool(const char* name,
int initCount,
int minCount,
int maxCount,
int step = THREAD_STEP,
int maxIdleTime = MAX_IDLE_THREAD_TIME,
int checkldleThreadsInterval = CHECK_IDLE_THREADS_INTERVAL);
~ThreadPool();
void Destroy();
int AddWork(ThreadPoolWorkPtr pWork);
ThreadPoolWorkPtr GetWork(ThreadPoolWorker* pWorker);
void RemoveIdleThreads();
void RemoveThread(ThreadPoolWorker* pWorker);
bool WakeOneThread();
bool IsDestroy();
private:
void AddThreads(int count);
private:
bool m_destroy;
int m_minCount;
int m_maxCount;
int m_maxIdleTime;
int m_count;
int m_step;
char m_name[128];
unsigned int m_index;
unsigned long long m_lastRemoveIdleThreadsTime;
ThreadPoolManagePtr m_manager;
std::list<ThreadPoolWorkPtr> m_works;
std::list<ThreadPoolWorkerPtr> m_workers;
};
typedef kpr::RefHandleT<ThreadPool> ThreadPoolPtr;
}
#endif