thread_condition.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* Thread_condition 是多线程的条件控制类,主要是控制线程的启停和退出
  2. * 线程创建后,一般是循环运行,
  3. * 为了防止线程暂满整个cpu,那么需要线程在不工作的是否进入等待状态。
  4. * Thread_condition 就可以控制线程的运行状态。
  5. *
  6. std::atomic<bool> m_pass_ever //线程能否直接通过等待,对后面的线程也生效。
  7. std::atomic<bool> m_pass_once //线程能否直接通过等待,一次(通过一次之后,wait里面自动改为false)
  8. * 外部调用notify系列的函数,唤醒等待的线程,让线程执行功能函数。
  9. * 如果需要线程循环多次执行功能函数,那么就使用 notify_all(true),后面的线程可以直接通过等待了。
  10. * 再使用 notify_all(false) ,即可停止线程,让其继续等待。
  11. * 如果只想要线程执行一次,那就使用 notify_all(false, true)
  12. * 注:notify_all(false, true)和notify_one(false, true) 一样,只能让其中一个线程执行一次
  13. *
  14. * m_kill_flag //是否杀死线程,让线程强制退出,
  15. * 外部调用 kill_all() 函数,可以直接通知线程自动退出。
  16. //杀死所有的线程,强制退出线程函数,只是操作受当前Thread_condition影响的所有线程
  17. //唤醒所有线程,使其通过等待,但是不能运行功能函数,必须直接return
  18. // 注:只是修改m_kill为true,需要线程函数实时检测kill的状态,来return线程。
  19. // 通过等待之后,也要检查kill的状态,如果为真,那么就不能执行功能函数,应该直接return
  20. 注:notify唤醒线程之后,wait里面的判断函数会重新判断。
  21. */
  22. #include "thread_condition.h"
  23. Thread_condition::Thread_condition()
  24. {
  25. m_kill_flag = false;
  26. m_pass_ever = false;
  27. m_pass_once = false;
  28. m_working_flag = false;
  29. }
  30. Thread_condition::~Thread_condition()
  31. {
  32. kill_all();
  33. }
  34. //无限等待,由 is_pass_wait 决定是否阻塞。
  35. //返回m_pass,
  36. bool Thread_condition::wait()
  37. {
  38. std::unique_lock<std::mutex> loc(m_mutex);
  39. m_condition_variable.wait(loc,std::bind(is_pass_wait,this));
  40. bool t_pass = is_pass_wait(this);
  41. m_pass_once = false;
  42. //只要前面通过了, 那就进入工作状态
  43. m_working_flag = true;
  44. return t_pass;
  45. }
  46. //等待一定的时间(默认时间单位:毫秒ms),由 is_pass_wait 决定是否阻塞。
  47. //return:is_pass_wait的结果, true:线程直接通过等待,false:线程超时了,然后通过等待。
  48. //注意了:线程阻塞期间,是不会return的。
  49. bool Thread_condition::wait_for_millisecond(unsigned int millisecond)
  50. {
  51. std::unique_lock<std::mutex> loc(m_mutex);
  52. m_condition_variable.wait_for(loc, std::chrono::milliseconds(millisecond), std::bind(is_pass_wait, this));
  53. bool t_pass = is_pass_wait(this);
  54. m_pass_once = false;
  55. //只要前面通过了, 那就进入工作状态 , 超时通过也算通过
  56. m_working_flag = true;
  57. return t_pass;
  58. }
  59. //唤醒已经阻塞的线程,唤醒一个线程
  60. //pass_ever 或者 pass_once 为真时,才能唤醒线程。都为假时,线程进入等待。
  61. void Thread_condition::notify_one(bool pass_ever, bool pass_once)
  62. {
  63. std::unique_lock<std::mutex> loc(m_mutex);
  64. m_pass_ever = pass_ever;
  65. m_pass_once = pass_once;
  66. m_condition_variable.notify_one();
  67. }
  68. //唤醒已经阻塞的线程,唤醒全部线程
  69. //pass_ever 或者 pass_once 为真时,才能唤醒线程。都为假时,线程进入等待。
  70. void Thread_condition::notify_all(bool pass_ever, bool pass_once)
  71. {
  72. std::unique_lock<std::mutex> loc(m_mutex);
  73. m_pass_ever = pass_ever;
  74. m_pass_once = pass_once;
  75. m_condition_variable.notify_all();
  76. }
  77. //注:notify_all(false, true)和notify_one(false, true) 一样,只能让其中一个线程执行一次
  78. //杀死所有的线程,强制退出线程函数,只是操作受当前Thread_condition影响的所有线程
  79. //唤醒所有线程,使其通过等待,但是不能运行功能函数,必须直接return
  80. // 注:只是修改m_kill为true,需要线程函数实时检测kill的状态,来return线程。
  81. // 通过等待之后,也要检查kill的状态,如果为真,那么就不能执行功能函数,应该直接return
  82. void Thread_condition::kill_all()
  83. {
  84. std::unique_lock<std::mutex> loc(m_mutex);
  85. m_kill_flag = true;
  86. m_condition_variable.notify_all();
  87. }
  88. //判断是否存活,只有活着才能继续支持子线程从功能函数,否则需要强制退出函数并结束子线程
  89. bool Thread_condition::is_alive()
  90. {
  91. return !m_kill_flag;
  92. }
  93. //判断是否等待, 外部线程通过这个函数来查询this线程的工作状态,
  94. bool Thread_condition::is_waiting()
  95. {
  96. return !m_working_flag;
  97. }
  98. //判断是否工作, 外部线程通过这个函数来查询this线程的工作状态,
  99. bool Thread_condition::is_working()
  100. {
  101. return m_working_flag;
  102. }
  103. bool Thread_condition::get_kill_flag()
  104. {
  105. return m_kill_flag;
  106. }
  107. bool Thread_condition::get_pass_ever()
  108. {
  109. return m_pass_ever;
  110. }
  111. bool Thread_condition::get_pass_once()
  112. {
  113. return m_pass_once;
  114. }
  115. void Thread_condition::set_kill_flag(bool kill)
  116. {
  117. m_kill_flag = kill;
  118. }
  119. void Thread_condition::set_pass_ever(bool pass_ever)
  120. {
  121. m_pass_ever = pass_ever;
  122. }
  123. void Thread_condition::set_pass_once(bool pass_once)
  124. {
  125. m_pass_once = pass_once;
  126. }
  127. void Thread_condition::reset(bool kill, bool pass_ever, bool pass_once)
  128. {
  129. m_kill_flag = kill;
  130. m_pass_ever = pass_ever;
  131. m_pass_once = pass_once;
  132. }
  133. //判断线程是否可以通过等待,wait系列函数的判断标志
  134. //注:m_kill或者m_pass为真时,return true
  135. bool Thread_condition::is_pass_wait(Thread_condition * other)
  136. {
  137. if ( other == NULL )
  138. {
  139. throw (other);
  140. return false;
  141. }
  142. bool result = (other->m_kill_flag || other->m_pass_ever || other->m_pass_once);
  143. //如果不能通过等待, 那么线程状态改为等待中,
  144. if ( !result )
  145. {
  146. other->m_working_flag = false;
  147. }
  148. return result;
  149. }