线程池:一种线程的使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,避免了在处理短时间任务时创建与销毁线程的代价,防止过度调度。这里使用
std::thread创建线程池,包括启动(start()),停止方法(stop()),及任务添加方法(addTask).
start()创建一定数量的线程池,进行线程循环.
stop()停止所有线程循环,回收所有资源.
addTask()添加任务
引用:https://www.cnblogs.com/ailumiyana/p/10016965.html
基于C++线程池已由描述,这里仅介绍std::thread使用方法
- thread()创建无参的对象默认是join able的,即被其它线程所阻塞
- get_id():获取线程ID
- joinable():检查该线程是否可以被join
- detach():将当前线程对象所代表的执行实例与该线程对象分离,独立存在
- swap(): 线程交换,交换两个线程对象所代表的底层句柄
- sleep_for() std::this_thread命名空间函数
- yield() 当前线程放弃执行,操作系统调度另一线程继续执行,std::this_thread命名空间函数
- join(): join线程,调用该函数会阻塞线程直到执行完返回为止继续
void thread_pool::start()
{
assert(m_threads.empty());
m_is_started = true;
m_threads.reserve(m_init_threads_size);
for (int i = 0; i < m_init_threads_size; ++i)
{
m_threads.push_back(new std::thread(std::bind(&thread_pool::thread_loop, this)));
//std::cout << "#######thread id is: " << m_threads[i]->get_id() << std::endl;
}
}
void thread_pool::stop()
{
__SOLA_LOG(debug, "thread_pool::stop() stop.");
{
std::unique_lock<std::mutex> lock(m_mutex);
m_is_started = false;
m_cond.notify_all();
__SOLA_LOG(debug, "thread_pool::stop() notifyAll().");
}
for (threads_t::iterator it = m_threads.begin(); it != m_threads.end() ; ++it)
{
(*it)->join();
delete *it;
}
m_threads.clear();
}