TaskPool.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * 任务池模型,TaskPool.cpp
  3. * zhangyl 2019.02.14
  4. */
  5. #include "TaskPool.h"
  6. TaskPool::TaskPool() : m_bRunning(false)
  7. {
  8. }
  9. TaskPool::~TaskPool()
  10. {
  11. removeAllTasks();
  12. }
  13. void TaskPool::init(int threadNum/* = 5*/)
  14. {
  15. if (threadNum <= 0)
  16. threadNum = 5;
  17. m_bRunning = true;
  18. for (int i = 0; i < threadNum; ++i)
  19. {
  20. std::shared_ptr<std::thread> spThread;
  21. spThread.reset(new std::thread(std::bind(&TaskPool::threadFunc, this)));
  22. m_threads.push_back(spThread);
  23. }
  24. }
  25. void TaskPool::threadFunc()
  26. {
  27. std::shared_ptr<Task> spTask;
  28. while (true)
  29. {
  30. std::unique_lock<std::mutex> guard(m_mutexList);
  31. while (m_taskList.empty())
  32. {
  33. if (!m_bRunning)
  34. break;
  35. //如果获得了互斥锁,但是条件不合适的话,pthread_cond_wait会释放锁,不往下执行。
  36. //当发生变化后,条件合适,pthread_cond_wait将直接获得锁。
  37. m_cv.wait(guard);
  38. }
  39. if (!m_bRunning)
  40. break;
  41. spTask = m_taskList.front();
  42. m_taskList.pop_front();
  43. if (spTask == NULL)
  44. continue;
  45. spTask->doIt();
  46. spTask.reset();
  47. }
  48. std::cout << "exit thread, threadID: " << std::this_thread::get_id() << std::endl;
  49. }
  50. void TaskPool::stop()
  51. {
  52. m_bRunning = false;
  53. m_cv.notify_all();
  54. //等待所有线程退出
  55. for (auto& iter : m_threads)
  56. {
  57. if (iter->joinable())
  58. iter->join();
  59. }
  60. }
  61. void TaskPool::addTask(Task* task)
  62. {
  63. std::shared_ptr<Task> spTask;
  64. spTask.reset(task);
  65. {
  66. std::lock_guard<std::mutex> guard(m_mutexList);
  67. //m_taskList.push_back(std::make_shared<Task>(task));
  68. m_taskList.push_back(spTask);
  69. std::cout << "add a Task." << std::endl;
  70. }
  71. m_cv.notify_one();
  72. }
  73. void TaskPool::removeAllTasks()
  74. {
  75. {
  76. std::lock_guard<std::mutex> guard(m_mutexList);
  77. for (auto& iter : m_taskList)
  78. {
  79. iter.reset();
  80. }
  81. m_taskList.clear();
  82. }
  83. }