64,640
社区成员
发帖
与我相关
我的任务
分享
#ifndef _THERAD_POOL_INCLUDE_H_
#define _THERAD_POOL_INCLUDE_H_
#include "singleton_include.h"
typedef std::function<void()> TPTask;
typedef std::vector<TPTask> TPTaskCollection;
typedef std::future<void> TPResult;
typedef std::vector<TPResult> TPResultCollection;
class ThreadPool: public Singleton<ThreadPool>
{
public:
TPResultCollection Post(const TPTaskCollection& tasks)
{
TPResultCollection r;
std::unique_lock<std::mutex> lock(m_mutex);
for(const TPTask& t: tasks)
{
PkgTask task(t);
r.push_back(task.get_future());
m_queue.push(std::move(task));
}
m_cv.notify_all();
return r;
}
TPResult Post(const TPTask& t)
{
PkgTask task(t);
TPResult r = task.get_future();
std::unique_lock<std::mutex> lock(m_mutex);
m_queue.push(std::move(task));
m_cv.notify_one();
return r;
}
int GetThreadCount() const
{
return THREAD_COUNT;
}
private:
explicit ThreadPool(int threadCount):
THREAD_COUNT(threadCount),
m_stop(false)
{
for(int i = 0; i < THREAD_COUNT; i++)
{
m_threads.push_back(std::thread(&ThreadPool::ThreadHandler, this));
}
}
~ThreadPool()
{
m_stop = true;
m_cv.notify_all();
for(int i = 0; i < THREAD_COUNT; i++)
{
m_threads[i].join();
}
}
void ThreadHandler()
{
while(!m_stop)
{
{
std::unique_lock<std::mutex> lock(m_mtx);
m_cv.wait(lock, [&]{return !m_queue.empty();});
}
PkgTaskCollection tasks;
{
std::unique_lock<std::mutex> lock(m_mutex);
while(!m_queue.empty())
{
PkgTask& task = m_queue.front();
tasks.push_back(std::move(task));
m_queue.pop();
}
}
if(!m_stop)
{
for(PkgTask& task: tasks)
{
task();
}
}
}
}
friend class Singleton<ThreadPool>;
private:
const int THREAD_COUNT;
volatile bool m_stop;
std::condition_variable m_cv;
std::mutex m_mtx;
std::vector<std::thread> m_threads;
typedef std::packaged_task<void()> PkgTask;
typedef std::vector<PkgTask> PkgTaskCollection;
std::queue<PkgTask> m_queue;
std::mutex m_mutex;
};
#endif // _THERAD_POOL_INCLUDE_H_