天天看点

线程云集(二)——C++STL线程池

线程池:一种线程的使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,避免了在处理短时间任务时创建与销毁线程的代价,防止过度调度。这里使用

std::thread创建线程池,包括启动(start()),停止方法(stop()),及任务添加方法(addTask).

start()创建一定数量的线程池,进行线程循环.

stop()停止所有线程循环,回收所有资源.

addTask()添加任务

引用:https://www.cnblogs.com/ailumiyana/p/10016965.html

基于C++线程池已由描述,这里仅介绍std::thread使用方法

  1. thread()创建无参的对象默认是join able的,即被其它线程所阻塞
  2. get_id():获取线程ID
  3. joinable():检查该线程是否可以被join
  4. detach():将当前线程对象所代表的执行实例与该线程对象分离,独立存在
  5. swap(): 线程交换,交换两个线程对象所代表的底层句柄
  6. sleep_for() std::this_thread命名空间函数
  7. yield() 当前线程放弃执行,操作系统调度另一线程继续执行,std::this_thread命名空间函数
  8. 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();
}