此线程池所依赖的线程类,请参看《一个Windows C++的线程类实现》:
ThreadPoolExecutor.h
<span> 1</span>
<span>#ifndef __THREAD_POOL_EXECUTOR__
</span>
<span> 2</span>
<span>#define</span> __THREAD_POOL_EXECUTOR__
<span> 3</span><span> 4</span> #include <span>"</span><span>Thread.h</span><span>"</span><span> 5</span> #include <<span>set</span>>
<span> 6</span> #include <list>
<span> 7</span> #include <windows.h>
<span> 8</span><span> 9</span><span>class</span><span> CThreadPoolExecutor
</span><span>10</span><span>{
</span><span>11</span><span>public</span><span>:
</span><span>12</span> CThreadPoolExecutor(<span>void</span><span>);
</span><span>13</span> ~CThreadPoolExecutor(<span>void</span><span>);
</span><span>14</span><span>15</span><span>/*</span><span>*
</span><span>16</span><span> 初始化线程池,创建minThreads个线程
</span><span>17</span><span> *</span><span>*/</span><span>18</span><span>bool</span> Init(unsigned <span>int</span> minThreads, unsigned <span>int</span> maxThreads, unsigned <span>int</span><span> maxPendingTaskse);
</span><span>19</span><span>20</span><span>/*</span><span>*
</span><span>21</span><span> 执行任务,若当前任务列表没有满,将此任务插入到任务列表,返回true
</span><span>22</span><span> 若当前任务列表满了,但当前线程数量小于最大线程数,将创建新线程执行此任务,返回true
</span><span>23</span><span> 若当前任务列表满了,但当前线程数量等于最大线程数,将丢弃此任务,返回false
</span><span>24</span><span> *</span><span>*/</span><span>25</span><span>bool</span> Execute(Runnable *<span> pRunnable);
</span><span>26</span><span>27</span><span>/*</span><span>*
</span><span>28</span><span> 终止线程池,先制止塞入任务,
</span><span>29</span><span> 然后等待直到任务列表为空,
</span><span>30</span><span> 然后设置最小线程数量为0,
</span><span>31</span><span> 等待直到线程数量为空,
</span><span>32</span><span> 清空垃圾堆中的任务
</span><span>33</span><span> *</span><span>*/</span><span>34</span><span>void</span><span> Terminate();
</span><span>35</span><span>36</span><span>/*</span><span>*
</span><span>37</span><span> 返回线程池中当前的线程数量
</span><span>38</span><span> *</span><span>*/</span><span>39</span> unsigned <span>int</span><span> GetThreadPoolSize();
</span><span>40</span><span>41</span><span>private</span><span>:
</span><span>42</span><span>/*</span><span>*
</span><span>43</span><span> 获取任务列表中的任务,若任务列表为空,返回NULL
</span><span>44</span><span> *</span><span>*/</span><span>45</span> Runnable *<span> GetTask();
</span><span>46</span><span>47</span><span>static</span> unsigned <span>int</span> WINAPI StaticThreadFunc(<span>void</span> *<span> arg);
</span><span>48</span><span>49</span><span>private</span><span>:
</span><span>50</span><span>class</span> CWorker : <span>public</span><span> CThread
</span><span>51</span><span> {
</span><span>52</span><span>public</span><span>:
</span><span>53</span> CWorker(CThreadPoolExecutor * pThreadPool, Runnable * pFirstTask =<span> NULL);
</span><span>54</span> ~<span>CWorker();
</span><span>55</span><span>void</span><span> Run();
</span><span>56</span><span>57</span><span>private</span><span>:
</span><span>58</span> CThreadPoolExecutor *<span> m_pThreadPool;
</span><span>59</span> Runnable *<span> m_pFirstTask;
</span><span>60</span><span>volatile</span><span>bool</span><span> m_bRun;
</span><span>61</span><span> };
</span><span>62</span><span>63</span> typedef std::<span>set</span><CWorker *><span> ThreadPool;
</span><span>64</span> typedef std::list<Runnable *><span> Tasks;
</span><span>65</span><span> typedef Tasks::iterator TasksItr;
</span><span>66</span><span> typedef ThreadPool::iterator ThreadPoolItr;
</span><span>67</span><span>68</span><span> ThreadPool m_ThreadPool;
</span><span>69</span><span> ThreadPool m_TrashThread;
</span><span>70</span><span> Tasks m_Tasks;
</span><span>71</span><span>72</span><span> CRITICAL_SECTION m_csTasksLock;
</span><span>73</span><span> CRITICAL_SECTION m_csThreadPoolLock;
</span><span>74</span><span>75</span><span>volatile</span><span>bool</span><span> m_bRun;
</span><span>76</span><span>volatile</span><span>bool</span><span> m_bEnableInsertTask;
</span><span>77</span><span>volatile</span> unsigned <span>int</span><span> m_minThreads;
</span><span>78</span><span>volatile</span> unsigned <span>int</span><span> m_maxThreads;
</span><span>79</span><span>volatile</span> unsigned <span>int</span><span> m_maxPendingTasks;
</span><span>80</span><span>};
</span><span>81</span><span>82</span><span>#endif</span>
ThreadPoolExecutor .cpp
<span> 1</span> #include <span>"</span><span>stdafx.h</span><span>"</span><span> 2</span><span> 3</span> #include <span>"</span><span>ThreadPoolExecutor.h</span><span>"</span><span> 4</span><span> 5</span> CThreadPoolExecutor::CWorker::CWorker(CThreadPoolExecutor * pThreadPool, Runnable *<span> pFirstTask) :
</span><span> 6</span><span>m_pThreadPool(pThreadPool),
</span><span> 7</span><span>m_pFirstTask(pFirstTask),
</span><span> 8</span> m_bRun(<span>true</span><span>)
</span><span> 9</span><span>{
</span><span> 10</span><span> 11</span><span>}
</span><span> 12</span><span> 13</span> CThreadPoolExecutor::CWorker::~<span>CWorker()
</span><span> 14</span><span>{
</span><span> 15</span><span>}
</span><span> 16</span><span> 17</span><span>/*</span><span>*
</span><span> 18</span><span> 执行任务的工作线程。
</span><span> 19</span><span> 当前没有任务时,
</span><span> 20</span><span> 如果当前线程数量大于最小线程数量,减少线程,
</span><span> 21</span><span> 否则,执行清理程序,将线程类给释放掉
</span><span> 22</span><span>*</span><span>*/</span><span> 23</span><span>void</span><span> CThreadPoolExecutor::CWorker::Run()
</span><span> 24</span><span>{
</span><span> 25</span> Runnable * pTask =<span> NULL;
</span><span> 26</span><span>while</span><span>(m_bRun)
</span><span> 27</span><span> {
</span><span> 28</span><span>if</span>(NULL ==<span> m_pFirstTask)
</span><span> 29</span><span> {
</span><span> 30</span> pTask = m_pThreadPool-><span>GetTask();
</span><span> 31</span><span> }
</span><span> 32</span><span>else</span><span> 33</span><span> {
</span><span> 34</span> pTask =<span> m_pFirstTask;
</span><span> 35</span> m_pFirstTask =<span> NULL;
</span><span> 36</span><span> }
</span><span> 37</span><span> 38</span><span>if</span>(NULL ==<span> pTask)
</span><span> 39</span><span> {
</span><span> 40</span> EnterCriticalSection(&(m_pThreadPool-><span>m_csThreadPoolLock));
</span><span> 41</span><span>if</span>(m_pThreadPool->GetThreadPoolSize() > m_pThreadPool-><span>m_minThreads)
</span><span> 42</span><span> {
</span><span> 43</span> ThreadPoolItr itr = m_pThreadPool->m_ThreadPool.find(<span>this</span><span>);
</span><span> 44</span><span>if</span>(itr != m_pThreadPool-><span>m_ThreadPool.end())
</span><span> 45</span><span> {
</span><span> 46</span> m_pThreadPool-><span>m_ThreadPool.erase(itr);
</span><span> 47</span> m_pThreadPool->m_TrashThread.insert(<span>this</span><span>);
</span><span> 48</span><span> }
</span><span> 49</span> m_bRun = <span>false</span><span>;
</span><span> 50</span><span> }
</span><span> 51</span><span>else</span><span> 52</span><span> {
</span><span> 53</span> ThreadPoolItr itr = m_pThreadPool-><span>m_TrashThread.begin();
</span><span> 54</span><span>while</span>(itr != m_pThreadPool-><span>m_TrashThread.end())
</span><span> 55</span><span> {
</span><span> 56</span> (*itr)-><span>Join();
</span><span> 57</span><span>delete</span> (*<span>itr);
</span><span> 58</span> m_pThreadPool-><span>m_TrashThread.erase(itr);
</span><span> 59</span> itr = m_pThreadPool-><span>m_TrashThread.begin();
</span><span> 60</span><span> }
</span><span> 61</span><span> }
</span><span> 62</span> LeaveCriticalSection(&(m_pThreadPool-><span>m_csThreadPoolLock));
</span><span> 63</span><span>continue</span><span>;
</span><span> 64</span><span> }
</span><span> 65</span><span>else</span><span> 66</span><span> {
</span><span> 67</span> pTask-><span>Run();
</span><span> 68</span> pTask =<span> NULL;
</span><span> 69</span><span> }
</span><span> 70</span><span> }
</span><span> 71</span><span>}
</span><span> 72</span><span> 73</span><span>/////////////////////////////////////////////////////////////////////////////////////////////</span><span> 74</span><span> 75</span> CThreadPoolExecutor::CThreadPoolExecutor(<span>void</span><span>) :
</span><span> 76</span> m_bRun(<span>false</span><span>),
</span><span> 77</span> m_bEnableInsertTask(<span>false</span><span>)
</span><span> 78</span><span>{
</span><span> 79</span> InitializeCriticalSection(&<span>m_csTasksLock);
</span><span> 80</span> InitializeCriticalSection(&<span>m_csThreadPoolLock);
</span><span> 81</span><span>}
</span><span> 82</span><span> 83</span> CThreadPoolExecutor::~CThreadPoolExecutor(<span>void</span><span>)
</span><span> 84</span><span>{
</span><span> 85</span><span> Terminate();
</span><span> 86</span> DeleteCriticalSection(&<span>m_csTasksLock);
</span><span> 87</span> DeleteCriticalSection(&<span>m_csThreadPoolLock);
</span><span> 88</span><span>}
</span><span> 89</span><span> 90</span><span>bool</span> CThreadPoolExecutor::Init(unsigned <span>int</span> minThreads, unsigned <span>int</span> maxThreads, unsigned <span>int</span><span> maxPendingTasks)
</span><span> 91</span><span>{
</span><span> 92</span><span>if</span>(minThreads == <span>0</span><span>)
</span><span> 93</span><span> {
</span><span> 94</span><span>return</span><span>false</span><span>;
</span><span> 95</span><span> }
</span><span> 96</span><span>if</span>(maxThreads <<span> minThreads)
</span><span> 97</span><span> {
</span><span> 98</span><span>return</span><span>false</span><span>;
</span><span> 99</span><span> }
</span><span>100</span> m_minThreads =<span> minThreads;
</span><span>101</span> m_maxThreads =<span> maxThreads;
</span><span>102</span> m_maxPendingTasks =<span> maxPendingTasks;
</span><span>103</span> unsigned <span>int</span> i =<span> m_ThreadPool.size();
</span><span>104</span><span>for</span>(; i<minThreads; i++<span>)
</span><span>105</span><span> {
</span><span>106</span><span>//</span><span>创建线程 </span><span>107</span> CWorker * pWorker = <span>new</span> CWorker(<span>this</span><span>);
</span><span>108</span><span>if</span>(NULL ==<span> pWorker)
</span><span>109</span><span> {
</span><span>110</span><span>return</span><span>false</span><span>;
</span><span>111</span><span> }
</span><span>112</span> EnterCriticalSection(&<span>m_csThreadPoolLock);
</span><span>113</span><span> m_ThreadPool.insert(pWorker);
</span><span>114</span> LeaveCriticalSection(&<span>m_csThreadPoolLock);
</span><span>115</span> pWorker-><span>Start();
</span><span>116</span><span> }
</span><span>117</span> m_bRun = <span>true</span><span>;
</span><span>118</span> m_bEnableInsertTask = <span>true</span><span>;
</span><span>119</span><span>return</span><span>true</span><span>;
</span><span>120</span><span>}
</span><span>121</span><span>122</span><span>bool</span> CThreadPoolExecutor::Execute(Runnable *<span> pRunnable)
</span><span>123</span><span>{
</span><span>124</span><span>if</span>(!<span>m_bEnableInsertTask)
</span><span>125</span><span> {
</span><span>126</span><span>return</span><span>false</span><span>;
</span><span>127</span><span> }
</span><span>128</span><span>if</span>(NULL ==<span> pRunnable)
</span><span>129</span><span> {
</span><span>130</span><span>return</span><span>false</span><span>;
</span><span>131</span><span> }
</span><span>132</span><span>if</span>(m_Tasks.size() >=<span> m_maxPendingTasks)
</span><span>133</span><span> {
</span><span>134</span><span>if</span>(m_ThreadPool.size() <<span> m_maxThreads)
</span><span>135</span><span> {
</span><span>136</span> CWorker * pWorker = <span>new</span> CWorker(<span>this</span><span>, pRunnable);
</span><span>137</span><span>if</span>(NULL ==<span> pWorker)
</span><span>138</span><span> {
</span><span>139</span><span>return</span><span>false</span><span>;
</span><span>140</span><span> }
</span><span>141</span> EnterCriticalSection(&<span>m_csThreadPoolLock);
</span><span>142</span><span> m_ThreadPool.insert(pWorker);
</span><span>143</span> LeaveCriticalSection(&<span>m_csThreadPoolLock);
</span><span>144</span> pWorker-><span>Start();
</span><span>145</span><span> }
</span><span>146</span><span>else</span><span>147</span><span> {
</span><span>148</span><span>return</span><span>false</span><span>;
</span><span>149</span><span> }
</span><span>150</span><span> }
</span><span>151</span><span>else</span><span>152</span><span> {
</span><span>153</span> EnterCriticalSection(&<span>m_csTasksLock);
</span><span>154</span><span> m_Tasks.push_back(pRunnable);
</span><span>155</span> LeaveCriticalSection(&<span>m_csTasksLock);
</span><span>156</span><span> }
</span><span>157</span><span>return</span><span>true</span><span>;
</span><span>158</span><span>}
</span><span>159</span><span>160</span> Runnable *<span> CThreadPoolExecutor::GetTask()
</span><span>161</span><span>{
</span><span>162</span> Runnable * Task =<span> NULL;
</span><span>163</span> EnterCriticalSection(&<span>m_csTasksLock);
</span><span>164</span><span>if</span>(!<span>m_Tasks.empty())
</span><span>165</span><span> {
</span><span>166</span> Task =<span> m_Tasks.front();
</span><span>167</span><span> m_Tasks.pop_front();
</span><span>168</span><span> }
</span><span>169</span> LeaveCriticalSection(&<span>m_csTasksLock);
</span><span>170</span><span>return</span><span> Task;
</span><span>171</span><span>}
</span><span>172</span><span>173</span> unsigned <span>int</span><span> CThreadPoolExecutor::GetThreadPoolSize()
</span><span>174</span><span>{
</span><span>175</span><span>return</span><span> m_ThreadPool.size();
</span><span>176</span><span>}
</span><span>177</span><span>178</span><span>void</span><span> CThreadPoolExecutor::Terminate()
</span><span>179</span><span>{
</span><span>180</span> m_bEnableInsertTask = <span>false</span><span>;
</span><span>181</span><span>while</span>(m_Tasks.size() > <span>0</span><span>)
</span><span>182</span><span> {
</span><span>183</span> Sleep(<span>1</span><span>);
</span><span>184</span><span> }
</span><span>185</span> m_bRun = <span>false</span><span>;
</span><span>186</span> m_minThreads = <span>0</span><span>;
</span><span>187</span> m_maxThreads = <span>0</span><span>;
</span><span>188</span> m_maxPendingTasks = <span>0</span><span>;
</span><span>189</span><span>while</span>(m_ThreadPool.size() > <span>0</span><span>)
</span><span>190</span><span> {
</span><span>191</span> Sleep(<span>1</span><span>);
</span><span>192</span><span> }
</span><span>193</span> EnterCriticalSection(&<span>m_csThreadPoolLock);
</span><span>194</span> ThreadPoolItr itr =<span> m_TrashThread.begin();
</span><span>195</span><span>while</span>(itr !=<span> m_TrashThread.end())
</span><span>196</span><span> {
</span><span>197</span> (*itr)-><span>Join();
</span><span>198</span><span>delete</span> (*<span>itr);
</span><span>199</span><span> m_TrashThread.erase(itr);
</span><span>200</span> itr =<span> m_TrashThread.begin();
</span><span>201</span><span> }
</span><span>202</span> LeaveCriticalSection(&<span>m_csThreadPoolLock);
</span><span>203</span> }
调用:
<span> 1</span> #include <span>"</span><span>stdafx.h</span><span>"</span><span> 2</span> #include <span>"</span><span>Thread.h</span><span>"</span><span> 3</span> #include <span>"</span><span>ThreadPoolExecutor.h</span><span>"</span><span> 4</span><span> 5</span><span>class</span> R : <span>public</span><span> Runnable
</span><span> 6</span><span>{
</span><span> 7</span><span>public</span><span>:
</span><span> 8</span> ~<span>R()
</span><span> 9</span><span> {
</span><span>10</span> printf(<span>"</span><span>~R/n</span><span>"</span><span>);
</span><span>11</span><span> }
</span><span>12</span><span>void</span><span> Run()
</span><span>13</span><span> {
</span><span>14</span> printf(<span>"</span><span>Hello World
</span><span>"</span><span>);
</span><span>15</span><span> }
</span><span>16</span><span>};
</span><span>17</span><span>18</span><span>19</span><span>int</span> _tmain(<span>int</span> argc, _TCHAR*<span> argv[])
</span><span>20</span><span>{
</span><span>21</span><span>/*</span><span>R r;
</span><span>22</span><span> CThread * t = NULL;
</span><span>23</span><span> t = new CThread(&r);
</span><span>24</span><span> t->Start();
</span><span>25</span><span> t->Join();
</span><span>26</span><span> getchar();</span><span>*/</span><span>27</span> CThreadPoolExecutor * pExecutor = <span>new</span><span> CThreadPoolExecutor();
</span><span>28</span> pExecutor->Init(<span>1</span>, <span>10</span>, <span>50</span><span>);
</span><span>29</span><span> R r;
</span><span>30</span><span>for</span>(<span>int</span> i=<span>0</span>;i<<span>100</span>;i++<span>)
</span><span>31</span><span> {
</span><span>32</span><span>while</span>(!pExecutor->Execute(&<span>r))
</span><span>33</span><span> {
</span><span>34</span><span> }
</span><span>35</span><span> }
</span><span>36</span> pExecutor-><span>Terminate();
</span><span>37</span><span>delete</span><span> pExecutor;
</span><span>38</span><span> getchar();
</span><span>39</span><span>return</span><span>0</span><span>;
</span><span>40</span><span>return</span><span>0</span><span>;
</span><span>41</span> }
from:http://blog.csdn.net/huyiyang2010/article/details/5809919
原文:http://www.cnblogs.com/chuyibky/p/5390514.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!