向请求队列中添加任务
通过list容器创建请求队列,向队列中添加时,通过互斥锁保证线程安全,添加完成后通过信号量提醒有任务要处理,最后线程同步。
template<typename T>
bool threadpool<T>::append(T* request)
{
m_queuelocker.lock();
//根据硬件,预先设置请求队列的最大值
if(m_workqueue.size()>m_max_requests)
{
m_queuelocker.unlock();
return false;
}
//添加任务
m_workqueue.push_back(request);
m_queuelocker.unlock();
//信号量提醒有任务要处理
m_queuestat.post();
return true;
}
run函数执行任务
工作线程从请求队列中取出某个任务进行处理,最后线程同步
template<typename T>
void threadpool<T>::run()
{
while(!m_stop)
{
//信号量等待
m_queuestat.wait();
//被唤醒后先加互斥锁
m_queuelocker.lock();
if(m_workqueue.empty())
{
m_queuelocker.unlock();
continue;
}
//从请求队列中取出第一个任务
//将任务从请求队列删除
T* request=m_workqueue.front();
m_workqueue.pop_front();
m_queuelocker.unlock();
if(!request)
continue;
//从连接池中取出一个数据库连接
request->mysql = m_connPool->GetConnection();
//process(模板类中的方法,这里是http类)进行处理
request->process();
//将数据库连接放回连接池
m_connPool->ReleaseConnection(request->mysql);
}
}