ThreadPool.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "stdafx.h"
  2. #include "ThreadPool.h"
  3. #include "msgdef.h"
  4. #include "WorkThread.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. #define MIN_THREAD_NUM 4 // 最小线程数为4个
  11. unsigned int WINAPI ThreadProc(IN LPVOID lpParam);
  12. CThreadPool::CThreadPool()
  13. {
  14. m_nMinThreadNum = 0;
  15. m_nMaxThreadNum = 0;
  16. m_nMinKeptIdleNum = 0;
  17. m_nMaxKeptIdleNum = 0;
  18. }
  19. CThreadPool::~CThreadPool()
  20. {
  21. }
  22. /************************************************************************/
  23. /*
  24. 函数:InitThreadPool
  25. 描述:初始化线程池
  26. 参数:
  27. IN CONST int nMinNum, // 最小数量,最少为4条线程
  28. IN CONST int nMaxNum, // 最大数量,一般为最小数量的2倍
  29. IN CONST int nMinKeptIdleNum, // 最小保持空闲数量
  30. IN CONST int MaxKeptIdleNum // 最大保持空闲数量,要>=最小数量
  31. 返回:
  32. */
  33. /************************************************************************/
  34. void CThreadPool::InitThreadPool(IN CONST int nMinNum)
  35. {
  36. m_nMinThreadNum = nMinNum<MIN_THREAD_NUM?MIN_THREAD_NUM:nMinNum;
  37. m_nMaxThreadNum = m_nMinThreadNum*2;
  38. m_nMinKeptIdleNum = m_nMinThreadNum==MIN_THREAD_NUM?2:3;
  39. m_nMaxKeptIdleNum = m_nMinThreadNum==MIN_THREAD_NUM?(m_nMinThreadNum - 1):m_nMinThreadNum - 2;
  40. int i = 0;
  41. for(i = 0; i<m_nMinThreadNum; ++i)
  42. {
  43. CThreadBase* p = new CWorkThread;
  44. if(p->Start() == 0)
  45. {
  46. --i;
  47. delete p;
  48. continue;
  49. }
  50. m_IdleList.Push_Back(p);
  51. m_ThreadList.Push_Back(p);
  52. }
  53. }
  54. /************************************************************************/
  55. /*
  56. 函数:Termination
  57. 描述:终止
  58. 参数:
  59. 返回:
  60. */
  61. /************************************************************************/
  62. void CThreadPool::TerminateAll()
  63. {
  64. m_BusyList.GetQueue().clear();
  65. m_IdleList.GetQueue().clear();
  66. m_ThreadList.Release();
  67. }
  68. /************************************************************************/
  69. /*
  70. 函数:AddEventItem
  71. 描述:添加事项
  72. 参数:
  73. IN CONST LPSEVENT lpEvent 事项
  74. 返回:0成功,-1空事项,-2已经达到最大线程数量
  75. */
  76. /************************************************************************/
  77. int CThreadPool::AddEventItem(IN CONST LPSEVENT lpEvent)
  78. {
  79. if(lpEvent == NULL)
  80. return -1;
  81. // 是否达到最大线程数量
  82. if(m_ThreadList.Size() > m_nMaxThreadNum)
  83. return -2;
  84. int i = 0;
  85. int nIdleSize = m_IdleList.Size();
  86. if(m_IdleList.Size() < m_nMinKeptIdleNum)
  87. {
  88. // 每次<最小保持空闲数量,都新创建4个
  89. for(i=0; i<MIN_THREAD_NUM; ++i)
  90. {
  91. CThreadBase* p = new CWorkThread;
  92. if(p->Start() == 0)
  93. {
  94. --i;
  95. delete p;
  96. continue;
  97. }
  98. m_IdleList.Push_Back(p);
  99. m_ThreadList.Push_Back(p);
  100. }
  101. }
  102. // 取出空闲线程,并唤醒分醒工作
  103. CThreadBase* pThread = m_IdleList.Pop_Front();
  104. m_BusyList.Push_Back(pThread);
  105. ((CWorkThread*)pThread)->AddEventItem(lpEvent, this);
  106. pThread->WakeUp();
  107. return 0;
  108. }
  109. /************************************************************************/
  110. /*
  111. 函数:IsDeleteThread
  112. 描述:是否删除线程
  113. 参数:
  114. IN CThreadBase* pThread 线程
  115. 返回:1已删除, 0不删除,存入空闲队列,-1不存在
  116. */
  117. /************************************************************************/
  118. int CThreadPool::IsDeleteThread(IN CThreadBase* pThread)
  119. {
  120. if(m_IdleList.Size() <= m_nMaxKeptIdleNum)
  121. return 0;
  122. if(m_ThreadList.Size() <= m_nMinThreadNum)
  123. return 0;
  124. m_BusyList.Remove(pThread);
  125. if(m_ThreadList.Delete(pThread) == 0)
  126. return -1;
  127. return 1;
  128. }
  129. /************************************************************************/
  130. /*
  131. 函数:MoveToIdleList
  132. 描述:将线程移到空闲列表
  133. 参数:
  134. IN CONST CThreadBase* pThread 当前工作完成的线程
  135. 返回:1成功, 0失败
  136. */
  137. /************************************************************************/
  138. int CThreadPool::MoveToIdleList(IN CThreadBase* pThread)
  139. {
  140. if(pThread == NULL)
  141. return 0;
  142. m_IdleList.Push_Back(pThread);
  143. return 1;
  144. }
  145. /************************************************************************/
  146. /*
  147. 函数:SetMaxKeptNum
  148. 描述:设置最大保持空闲数
  149. 参数:
  150. IN CONST int nNum 数量
  151. 返回:1成功, 0失败
  152. */
  153. /************************************************************************/
  154. void CThreadPool::SetMaxKeptNum(IN CONST int nNum)
  155. {
  156. CAutoLock autolock(&m_lock);
  157. m_nMaxKeptIdleNum = nNum;
  158. }
  159. /************************************************************************/
  160. /*
  161. 函数:GetMaxKeptNum
  162. 描述:获取最大保持空闲数
  163. 参数:
  164. 返回:数量
  165. */
  166. /************************************************************************/
  167. int CThreadPool::GetMaxKeptNum()
  168. {
  169. CAutoLock autolock(&m_lock);
  170. return m_nMaxKeptIdleNum;
  171. }
  172. /************************************************************************/
  173. /*
  174. 函数:GetMaxKeptNum
  175. 描述:获取最小保持空闲数
  176. 参数:
  177. 返回:数量
  178. */
  179. /************************************************************************/
  180. void CThreadPool::SetMinKeptNum(IN CONST int nNum)
  181. {
  182. CAutoLock autolock(&m_lock);
  183. m_nMinKeptIdleNum = nNum;
  184. }
  185. /************************************************************************/
  186. /*
  187. 函数:GetMaxKeptNum
  188. 描述:获取最小保持空闲数
  189. 参数:
  190. 返回:数量
  191. */
  192. /************************************************************************/
  193. int CThreadPool::GetMinKeptNum()
  194. {
  195. CAutoLock autolock(&m_lock);
  196. return m_nMinKeptIdleNum;
  197. }