线程池
线程池是线程的一种使用模式线程池linux,是管理和利用多线程处理多任务的一种方法。
解决的问题
当线程过多时,会带来调度开销,进而影响整体性能;
线程池维护多个线程,等待管理者分配可并发执行的任务;避免处理短时间任务时,创建和销毁线程的代价。
线程池可以保证内核的充分利用,防止过分调度。线程池中的线程数量取决于当前可用的并发处理器,内存,网络,套接字等。
应用场景
固定线程数的线程池的模拟实现
线程池就是大量的线程+任务队列
当任务队列为空时,线程阻塞
当有任务进入任务队列时,唤醒线程处理
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX_THREAD 5
#define MAX_QUEUE 10
typedef void(*handler_t)(int);
class MyTask{
private:
int _data;
handler_t _handler;
public:
MyTask(int data, handler_t handler)
:_data(data)
,_handler(handler)
{}
void Run()
{
return _handler(_data);
}
};
class ThreadPool{
private:
vector<thread> _thr_list;
queue<MyTask> _qTask;
int _capacity;
pthread_mutex_t _mutex;
pthread_cond_t _cond_con;
pthread_cond_t _cond_pro;
int _thr_max;
int _thr_cur;
bool _quit_flag;
void thr_start()
{
while(1)
{
pthread_mutex_lock(&_mutex);
while(_qTask.empty())
{
if(_quit_flag == true)
{
cout<<"thread exit"<<pthread_self()<<endl;
pthread_mutex_unlock(&_mutex);
_thr_cur--;
return ;
}
pthread_cond_wait(&_cond_con,&_mutex);
}
MyTask tt = _qTask.front();
_qTask.pop();
pthread_mutex_unlock(&_mutex);
pthread_cond_signal(&_cond_pro);
tt.Run();
}
return ;
}
public:
ThreadPool(int maxq = MAX_QUEUE, int maxt = MAX_THREAD)
:_thr_max(maxt)
,_capacity(maxq)
,_thr_list(maxt)
,_quit_flag(false)
{
pthread_mutex_init(&_mutex,NULL);
pthread_cond_init(&_cond_con,NULL);
pthread_cond_init(&_cond_pro,NULL);
}
~ThreadPool()
{
pthread_mutex_destroy(&_mutex);
pthread_cond_destroy(&_cond_con);
pthread_cond_destroy(&_cond_pro);
}
bool PoolInit()
{
_thr_cur = 0;
for(int i=0; i<_thr_max; i++)
{
_thr_list[i] = thread(&ThreadPool::thr_start, this);
_thr_cur++;
_thr_list[i].detach();
}
return true;
}
bool AddTask(MyTask& tt)
{
pthread_mutex_lock(&_mutex);
while(_qTask.size() == _capacity)
{
pthread_cond_wait(&_cond_pro,&_mutex);
}
_qTask.push(tt);
pthread_mutex_unlock(&_mutex);
pthread_cond_signal(&_cond_con);
return true;
}
bool PoolStop()
{
pthread_mutex_lock(&_mutex);
_quit_flag = true;
pthread_mutex_unlock(&_mutex);
while(_thr_cur > 0)
{
pthread_cond_broadcast(&_cond_con);
usleep(1000);
}
return true;
}
};
测试用例:
void test(int data)
{
srand(time(NULL));
int nesc = rand()%5;
cout<<"thread:"<<pthread_self()<<"~~~Thread data:"<<data<<" sleep:"<<nesc<<" seconds"<<endl;
sleep(nesc);
return ;
}
int main()
{
ThreadPool pool;
pool.PoolInit();
for(int i=0; i<10; i++)
{
MyTask tt(i,test);
pool.AddTask(tt);
}
pool.PoolStop();
return 0;
}

(编辑:成都站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|