thread_condition.puml 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. @startuml
  2. skinparam classAttributeIconSize 0
  3. title Thread_condition 是多线程的条件控制类,主要是控制线程的启停和退出
  4. note left of Thread_condition
  5. /* Thread_condition 是多线程的条件控制类,主要是控制线程的启停和退出
  6. * 线程创建后,一般是循环运行,
  7. * 为了防止线程暂满整个cpu,那么需要线程在不工作的是否进入等待状态。
  8. * Thread_condition 就可以控制线程的运行状态。
  9. *
  10. std::atomic<bool> m_pass_ever //线程能否直接通过等待,对后面的线程也生效。
  11. std::atomic<bool> m_pass_once //线程能否直接通过等待,一次(通过一次之后,wait里面自动改为false)
  12. * 外部调用notify系列的函数,唤醒等待的线程,让线程执行功能函数。
  13. * 如果需要线程循环多次执行功能函数,那么就使用 notify_all(true),后面的线程可以直接通过等待了。
  14. * 再使用 notify_all(false) ,即可停止线程,让其继续等待。
  15. * 如果只想要线程执行一次,那就使用 notify_all(false, true)
  16. * 注:notify_all(false, true)和notify_one(false, true) 一样,只能让其中一个线程执行一次
  17. *
  18. * m_kill_flag //是否杀死线程,让线程强制退出,
  19. * 外部调用 kill_all() 函数,可以直接通知线程自动退出。
  20. //杀死所有的线程,强制退出线程函数,只是操作受当前Thread_condition影响的所有线程
  21. //唤醒所有线程,使其通过等待,但是不能运行功能函数,必须直接return
  22. // 注:只是修改m_kill为true,需要线程函数实时检测kill的状态,来return线程。
  23. // 通过等待之后,也要检查kill的状态,如果为真,那么就不能执行功能函数,应该直接return
  24. 注:notify唤醒线程之后,wait里面的判断函数会重新判断。
  25. */
  26. end note
  27. class Thread_condition
  28. {
  29. ==public:==
  30. Thread_condition();
  31. Thread_condition(const Thread_condition& other) = delete;
  32. ~Thread_condition();
  33. ..
  34. //无限等待,由 is_pass_wait 决定是否阻塞。
  35. //返回m_pass,
  36. bool wait();
  37. ..
  38. //等待一定的时间(默认时间单位:毫秒ms),由 is_pass_wait 决定是否阻塞。
  39. //return:is_pass_wait的结果, true:线程直接通过等待,false:线程超时了,然后通过等待。
  40. //注意了:线程阻塞期间,是不会return的。
  41. bool wait_for_millisecond(unsigned int millisecond);
  42. ..
  43. //等待一定的时间(时间单位可调),由 is_pass_wait 决定是否阻塞。
  44. //return:is_pass_wait的结果, true:线程直接通过等待,false:线程超时了,然后通过等待。
  45. //注意了:线程阻塞期间,是不会return的。
  46. template<typename _Rep, typename _Period>
  47. bool wait_for_ex(const std::chrono::duration<_Rep, _Period>& time_duration);
  48. ..
  49. //唤醒已经阻塞的线程,唤醒一个线程
  50. //pass_ever 或者 pass_once 为真时,才能唤醒线程。都为假时,线程进入等待。
  51. void notify_one(bool pass_ever, bool pass_once = false);
  52. ..
  53. //唤醒已经阻塞的线程,唤醒全部线程
  54. //pass_ever 或者 pass_once 为真时,才能唤醒线程。都为假时,线程进入等待。
  55. void notify_all(bool pass_ever, bool pass_once = false);
  56. //注:notify_all(false, true)和notify_one(false, true) 一样,只能让其中一个线程执行一次
  57. ..
  58. //杀死所有的线程,强制退出线程函数,只是操作受当前Thread_condition影响的所有线程
  59. //唤醒所有线程,使其通过等待,但是不能运行功能函数,必须直接return
  60. // 注:只是修改m_kill为true,需要线程函数实时检测kill的状态,来return线程。
  61. // 通过等待之后,也要检查kill的状态,如果为真,那么就不能执行功能函数,应该直接return
  62. void kill_all();
  63. ..
  64. //判断是否或者,return !m_kill_flag
  65. bool is_alive();
  66. ==public:==
  67. bool get_kill_flag();
  68. bool get_pass_ever();
  69. bool get_pass_once();
  70. void set_kill_flag(bool kill);
  71. void set_pass_ever(bool pass_ever);
  72. void set_pass_once(bool pass_once);
  73. void reset(bool kill = false, bool pass_ever = false, bool pass_once = false);
  74. ==protected:==
  75. //判断线程是否可以通过等待,wait系列函数的判断标志
  76. //注:m_kill或者m_pass为真时,return true
  77. static bool is_pass_wait(Thread_condition * other);
  78. std::atomic<bool> m_kill_flag; //是否杀死线程,让线程强制退出,
  79. std::atomic<bool> m_pass_ever; //线程能否直接通过等待,对后面的线程也生效。
  80. std::atomic<bool> m_pass_once; //线程能否直接通过等待,一次(通过一次之后,wait里面自动改为false)
  81. std::mutex m_mutex; //线程的锁
  82. std::condition_variable m_condition_variable; //线程的条件变量
  83. ==private:==
  84. }
  85. @enduml