📄 threadpool_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>cmpp3api: threadpool.h源文件</title><link href="doxygen.css" rel="stylesheet" type="text/css"><link href="tabs.css" rel="stylesheet" type="text/css"></head><body><!-- 制作者 Doxygen 1.5.1-p1 --><div class="tabs"> <ul> <li><a href="main.html"><span>首页</span></a></li> <li><a href="annotated.html"><span>类</span></a></li> <li id="current"><a href="files.html"><span>文件</span></a></li> </ul></div><div class="tabs"> <ul> <li><a href="files.html"><span>文件列表</span></a></li> <li><a href="globals.html"><span>文件成员</span></a></li> </ul></div><h1>threadpool.h</h1><a href="threadpool_8h.html">浏览该文件的文档。</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <a name="l00014"></a>00014 <span class="preprocessor">#ifndef _SMAL_THREADPOOL_H</span><a name="l00015"></a>00015 <span class="preprocessor"></span><span class="preprocessor">#define _SMAL_THREADPOOL_H</span><a name="l00016"></a>00016 <span class="preprocessor"></span><a name="l00017"></a>00017 <span class="preprocessor">#include <<a class="code" href="smal_8h.html">smal.h</a>></span><a name="l00018"></a>00018 <a name="l00019"></a><a class="code" href="struct_i_job_desc.html">00019</a> <span class="keyword">struct </span><a class="code" href="struct_i_job_desc.html">IJobDesc</a><a name="l00020"></a>00020 {<a name="l00021"></a>00021 };<a name="l00022"></a>00022 <a name="l00023"></a><a class="code" href="struct_i_worker.html">00023</a> <span class="keyword">struct </span><a class="code" href="struct_i_worker.html">IWorker</a><a name="l00024"></a>00024 {<a name="l00025"></a>00025 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="struct_i_worker.html#f537f4fc6121564bb67e3c79a3091be8">ProcessJob</a>(<a class="code" href="struct_i_job_desc.html">IJobDesc</a>* pJob)=0;<a name="l00026"></a>00026 };<a name="l00027"></a>00027 <a name="l00028"></a>00028 <a name="l00029"></a><a class="code" href="struct_thread_info.html">00029</a> <span class="keyword">struct </span><a class="code" href="struct_thread_info.html">ThreadInfo</a><a name="l00030"></a>00030 {<a name="l00031"></a><a class="code" href="struct_thread_info.html#97a43768f1ffde24877f9f15d5228871">00031</a> DWORD <a class="code" href="struct_thread_info.html#97a43768f1ffde24877f9f15d5228871">m_pThreadId</a>;<a name="l00032"></a><a class="code" href="struct_thread_info.html#4432d6971ff2d5574ca78fb0baf6d1b5">00032</a> HANDLE <a class="code" href="struct_thread_info.html#4432d6971ff2d5574ca78fb0baf6d1b5">m_hThread</a>;<a name="l00033"></a><a class="code" href="struct_thread_info.html#f56c46f016ce62116d831aaf208b8b45">00033</a> <span class="keywordtype">bool</span> <a class="code" href="struct_thread_info.html#f56c46f016ce62116d831aaf208b8b45">m_bBusyWorking</a>;<a name="l00034"></a><a class="code" href="struct_thread_info.html#0c75aec7a6d8253572c24ecb89c011d1">00034</a> <a class="code" href="struct_thread_info.html#0c75aec7a6d8253572c24ecb89c011d1">ThreadInfo</a>() { <a class="code" href="struct_thread_info.html#4432d6971ff2d5574ca78fb0baf6d1b5">m_hThread</a>=0; <a class="code" href="struct_thread_info.html#f56c46f016ce62116d831aaf208b8b45">m_bBusyWorking</a>=<span class="keyword">false</span>; }<a name="l00035"></a><a class="code" href="struct_thread_info.html#da66e21527299ab0b0f39aea0b98f0f4">00035</a> <a class="code" href="struct_thread_info.html#0c75aec7a6d8253572c24ecb89c011d1">ThreadInfo</a>(HANDLE handle, <span class="keywordtype">bool</span> bBusy) { <a class="code" href="struct_thread_info.html#4432d6971ff2d5574ca78fb0baf6d1b5">m_hThread</a>=handle; <a class="code" href="struct_thread_info.html#f56c46f016ce62116d831aaf208b8b45">m_bBusyWorking</a>=bBusy; }<a name="l00036"></a><a class="code" href="struct_thread_info.html#ff0806e523b03b1d16c3fe99b0ea3ffd">00036</a> <a class="code" href="struct_thread_info.html#0c75aec7a6d8253572c24ecb89c011d1">ThreadInfo</a>(<span class="keyword">const</span> <a class="code" href="struct_thread_info.html">ThreadInfo</a>& info) { <a class="code" href="struct_thread_info.html#4432d6971ff2d5574ca78fb0baf6d1b5">m_hThread</a>=info.<a class="code" href="struct_thread_info.html#4432d6971ff2d5574ca78fb0baf6d1b5">m_hThread</a>; <a class="code" href="struct_thread_info.html#f56c46f016ce62116d831aaf208b8b45">m_bBusyWorking</a>=info.<a class="code" href="struct_thread_info.html#f56c46f016ce62116d831aaf208b8b45">m_bBusyWorking</a>; }<a name="l00037"></a>00037 };<a name="l00038"></a>00038 <a name="l00039"></a>00039 <a name="l00040"></a><a class="code" href="class_c_thread_pool.html">00040</a> <span class="keyword">class </span><a class="code" href="class_c_thread_pool.html">CThreadPool</a> <a name="l00041"></a>00041 {<a name="l00042"></a>00042 <span class="keyword">friend</span> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_thread_pool.html#4891cd33bb7c490dfd1c4bb766c2377b">CThreadPool::ManagerProc</a>(<span class="keywordtype">void</span>* p); <a name="l00043"></a>00043 <span class="keyword">friend</span> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_thread_pool.html#449f322aaa87df2766d3a2feded6b626">CThreadPool::WorkerProc</a>(<span class="keywordtype">void</span>* p);<a name="l00044"></a>00044 <span class="keyword">protected</span>:<a name="l00045"></a><a class="code" href="class_c_thread_pool.html#0bacfbb0688c2cf8ec70aa704cf94e44">00045</a> <span class="keyword">enum</span> <a class="code" href="class_c_thread_pool.html#0bacfbb0688c2cf8ec70aa704cf94e44">ThreadPoolStatus</a> { <a class="code" href="class_c_thread_pool.html#0bacfbb0688c2cf8ec70aa704cf94e44e966b9ae416e40c92f354941d73cfa13">BUSY</a>, <a class="code" href="class_c_thread_pool.html#0bacfbb0688c2cf8ec70aa704cf94e44a329efa7d2ef0aacd96f806bd9a56577">IDLE</a>, <a class="code" href="class_c_thread_pool.html#0bacfbb0688c2cf8ec70aa704cf94e444c580b4cecf074b58ed423170bb6808d">NORMAL</a> };<a name="l00046"></a>00046 <span class="keyword">public</span>:<a name="l00047"></a>00047 <span class="comment">//interface to the outside</span><a name="l00048"></a>00048 <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#66aed95042182184c2db963b0a4da111">Start</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nStatic, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nmax);<a name="l00049"></a>00049 <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#b33a8b0ae934bf438de2390604401cb0">Stop</a>(<span class="keywordtype">bool</span> bHash=<span class="keyword">false</span>);<a name="l00050"></a>00050 <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#c50e0ad426966495910eaf91b08014a8">ProcessJob</a>(<a class="code" href="struct_i_job_desc.html">IJobDesc</a>* pJob, <a class="code" href="struct_i_worker.html">IWorker</a>* pWorker) <span class="keyword">const</span>;<a name="l00051"></a>00051 <a name="l00052"></a>00052 <span class="comment">//constructor and destructor</span><a name="l00053"></a>00053 <a class="code" href="class_c_thread_pool.html#d782c35d603373734182289680d146c6">CThreadPool</a>();<a name="l00054"></a>00054 <span class="keyword">virtual</span> <a class="code" href="class_c_thread_pool.html#cb6a395b0928bd2472801b0d9ac8b3c0">~CThreadPool</a>();<a name="l00055"></a>00055 <a name="l00056"></a>00056 <span class="keyword">protected</span>:<a name="l00057"></a>00057 <span class="comment">//interfaces public:</span><a name="l00058"></a><a class="code" href="class_c_thread_pool.html#211a76b12e735223052dfd39798d916e">00058</a> HANDLE <a class="code" href="class_c_thread_pool.html#211a76b12e735223052dfd39798d916e">GetMgrIoPort</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_c_thread_pool.html#a63f27ba07c1d5b7af98e0427b592cf3">m_hMgrIoPort</a>; }<a name="l00059"></a><a class="code" href="class_c_thread_pool.html#9590db4a94c6264292e405f0f3b3fc65">00059</a> UINT <a class="code" href="class_c_thread_pool.html#9590db4a94c6264292e405f0f3b3fc65">GetMgrWaitTime</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1000*60; } <span class="comment">//1 minute</span><a name="l00060"></a><a class="code" href="class_c_thread_pool.html#133c43086875d2ab78036ff76179eec2">00060</a> HANDLE <a class="code" href="class_c_thread_pool.html#133c43086875d2ab78036ff76179eec2">GetWorkerIoPort</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="class_c_thread_pool.html#7e17984c77d1dfd20162b014aeb1caa1">m_hWorkerIoPort</a>; }<a name="l00061"></a>00061 <a name="l00062"></a>00062 <span class="keyword">private</span>:<a name="l00063"></a>00063 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_thread_pool.html#4891cd33bb7c490dfd1c4bb766c2377b">ManagerProc</a>(<span class="keywordtype">void</span>* p);<a name="l00064"></a>00064 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_c_thread_pool.html#449f322aaa87df2766d3a2feded6b626">WorkerProc</a>(<span class="keywordtype">void</span>* p);<a name="l00065"></a>00065 <span class="keyword">protected</span>:<a name="l00066"></a>00066 <span class="comment">//manager thread</span><a name="l00067"></a><a class="code" href="class_c_thread_pool.html#a8b4ceabf090930b3d3003d7487973a3">00067</a> HANDLE <a class="code" href="class_c_thread_pool.html#a8b4ceabf090930b3d3003d7487973a3">m_hMgrThread</a>;<a name="l00068"></a><a class="code" href="class_c_thread_pool.html#a63f27ba07c1d5b7af98e0427b592cf3">00068</a> HANDLE <a class="code" href="class_c_thread_pool.html#a63f27ba07c1d5b7af98e0427b592cf3">m_hMgrIoPort</a>;<a name="l00069"></a>00069 <span class="keyword">protected</span>:<a name="l00070"></a>00070 <span class="comment">//configuration parameters</span><a name="l00071"></a><a class="code" href="class_c_thread_pool.html#261943984797e12df4db2287f0349a99">00071</a> <span class="keyword">mutable</span> UINT <a class="code" href="class_c_thread_pool.html#261943984797e12df4db2287f0349a99">m_nNumberOfStaticThreads</a>;<a name="l00072"></a><a class="code" href="class_c_thread_pool.html#a602d3abd1256cd3bcfb144cf7c139bc">00072</a> <span class="keyword">mutable</span> UINT <a class="code" href="class_c_thread_pool.html#a602d3abd1256cd3bcfb144cf7c139bc">m_nNumberOfTotalThreads</a>;<a name="l00073"></a>00073 <a name="l00074"></a>00074 <span class="keyword">protected</span>:<a name="l00075"></a>00075 <span class="comment">//helper functions</span><a name="l00076"></a>00076 <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#0b09452c70390003bb457d7429178260">AddThreads</a>();<a name="l00077"></a>00077 <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#2ea3c73bf92832192cdd0c4901abe8df">RemoveThreads</a>();<a name="l00078"></a>00078 <a class="code" href="class_c_thread_pool.html#0bacfbb0688c2cf8ec70aa704cf94e44">ThreadPoolStatus</a> <a class="code" href="class_c_thread_pool.html#390dd6bb203634e9c7c855494e6a1470">GetThreadPoolStatus</a>();<a name="l00079"></a>00079 <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#1a7eefd03f1982ed78bbd97ccfc10f16">ChangeStatus</a>(DWORD threadId, <span class="keywordtype">bool</span> status);<a name="l00080"></a><a class="code" href="class_c_thread_pool.html#81bd2096c3f6b63f49968b9df24cae45">00080</a> <span class="keywordtype">void</span> <a class="code" href="class_c_thread_pool.html#81bd2096c3f6b63f49968b9df24cae45">RemoveThread</a>(DWORD threadId)<a name="l00081"></a>00081 {<a name="l00082"></a>00082 CSingleLock lock(&<a class="code" href="class_c_thread_pool.html#a013af10c9ca27fba4e87b6097d38eac">m_arrayCs</a>);<a name="l00083"></a>00083 lock.Lock();<a name="l00084"></a>00084 <a class="code" href="class_c_thread_pool.html#bd8adc284ceaee4a6780ef37108cf1a9">m_threadMap</a>.RemoveKey(threadId);<a name="l00085"></a>00085 lock.Unlock();<a name="l00086"></a>00086 }<a name="l00087"></a>00087 <a name="l00088"></a>00088 <span class="keyword">protected</span>:<a name="l00089"></a>00089 <span class="comment">//all the work threads</span><a name="l00090"></a><a class="code" href="class_c_thread_pool.html#bd8adc284ceaee4a6780ef37108cf1a9">00090</a> CMap<DWORD, DWORD&, ThreadInfo, ThreadInfo&> <a class="code" href="class_c_thread_pool.html#bd8adc284ceaee4a6780ef37108cf1a9">m_threadMap</a>;<a name="l00091"></a><a class="code" href="class_c_thread_pool.html#a013af10c9ca27fba4e87b6097d38eac">00091</a> CCriticalSection <a class="code" href="class_c_thread_pool.html#a013af10c9ca27fba4e87b6097d38eac">m_arrayCs</a>;<a name="l00092"></a><a class="code" href="class_c_thread_pool.html#7e17984c77d1dfd20162b014aeb1caa1">00092</a> HANDLE <a class="code" href="class_c_thread_pool.html#7e17984c77d1dfd20162b014aeb1caa1">m_hWorkerIoPort</a>;<a name="l00093"></a>00093 };<a name="l00094"></a>00094 <a name="l00095"></a>00095 <a name="l00096"></a>00096 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated at Sat May 19 16:03:55 2007 for cmpp3api by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1-p1 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -