<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>





<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 6.0">
<meta name="ProgId" content="FrontPage.Editor.Document"><title>jpeg editor</title>

<style>
<!--
	table td.head{ 
		background-color: #3a6ba5;
		border: 1px #000000 solid;
		font-family: Verdana;
		font-weight: bold;
		font-size: 14px;
		color: #f79c19;
		padding: 6px;
	}

	table td.body{ 
		border-bottom: 1px #6699CC dotted;
		text-align: left;
		font-family: Verdana, sans-serif, Arial;
		font-weight: normal;
		font-size: 14px;
		color: #3A6BA5;
		background-color: #fafafa;
		padding: 6px;
	}
	
-->
</style></head><body>



<p align="left"><font color="#ff0000" size="6"><span lang="en-ca"><b>&nbsp; 
 
</b></span><b>&nbsp;&nbsp;&nbsp; <span lang="en-ca">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Try to implement a naive thread pool used by message queue<br>
</span></b></font></p>
  <b><font color="#ff0000" size="5"><span lang="en-ca"></span><span lang="en-ca">The problem</span></font></b><div align="left">This
is a simple demo practice which targets to use a naive thread pool by a
message queue server. The motives come from the source code I happened
to see in CISCO which is a blocking msg queue, which means<br>
the server depends purely on its all message handler to be a quick one.
Otherwise one single handler can block the whole message queue loop.<br>
To run the demo test, run server first by giving argument of "server".
Then run client by giving argument of "client". Then client prompt to
input a file for server to display in terminal. Try to pickup a big
text file.<br>
However, I haven't really verified the performance of my algorithm as it is a simple practice.<br>
1. open a message queue requires a global unique key id. By enumerating
the argument "ch" in ftok, we can find a suitable one. Since client and
server share the code, this will be the same one. A better alternative
maybe simply close the message queue before opening it. This is
believed to be the common way.<br>
2. passing parameter bothers me a while as I have developed some nasty
habit like java programmer who assumes all variables are dynamic and
memory allocated when they are so casual in declaring countless
temporary variables, in hope run time java compiler to optimize the
code.&nbsp;<br>

<span style="font-weight: bold;"></span></div><br>#include &lt;iostream&gt;<br>
#include &lt;pthread.h&gt;<br>
#include &lt;sys/ipc.h&gt;<br>
#include &lt;sys/msg.h&gt;<br>
#include &lt;sys/types.h&gt;<br>
#include &lt;string.h&gt;<br>
#include &lt;stdio.h&gt;<br>
#include &lt;errno.h&gt;<br>
<br>
<br>
using namespace std;<br>
<br>
extern int errno;<br>
<br>
typedef void* (*ThreadProc)(void*);<br>
<br>
#define stricmp strcasecmp<br>
<br>
struct ThreadStruct<br>
{<br>
&nbsp;&nbsp; &nbsp;ThreadStruct():func(NULL), arg(NULL), argSize(0), bResult(NULL)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;}<br>
<br>
&nbsp;&nbsp; &nbsp;ThreadProc func;<br>
&nbsp;&nbsp; &nbsp;void* arg;<br>
&nbsp;&nbsp; &nbsp;int argSize;<br>
&nbsp;&nbsp; &nbsp;bool* bResult;<br>
};<br>
<br>
void* myThreadProc(void* pArg)<br>
{<br>
&nbsp;&nbsp; &nbsp;ThreadStruct* pThreadStruct = (ThreadStruct*) pArg;<br>
&nbsp;&nbsp; &nbsp;(*pThreadStruct-&gt;func)(pThreadStruct-&gt;arg);<br>
&nbsp;&nbsp; &nbsp;*pThreadStruct-&gt;bResult = true;<br>
&nbsp;&nbsp; &nbsp;return NULL;<br>
}<br>
<br>
class ThreadPool<br>
{<br>
public:<br>
&nbsp;&nbsp; &nbsp;ThreadPool(int nMax = 20): m_nThreads(nMax)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; pThreads = new pthread_t[m_nThreads];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; bAvailable = new bool[m_nThreads];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; pThreadStruct = new ThreadStruct[m_nThreads];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m_nThreads; i ++)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bAvailable[i] = true;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;}<br>
<br>
&nbsp;&nbsp; &nbsp;bool insertJob(ThreadProc proc, void* arg, int argSize)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; int i;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; m_nThreads; i ++)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (bAvailable[i])<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bAvailable[i] = false;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (i &gt;= m_nThreads)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; pThreadStruct[i].func = proc;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (pThreadStruct[i].argSize &lt; argSize)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delete [] pThreadStruct[i].arg;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pThreadStruct[i].arg = new char[argSize];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; pThreadStruct[i].argSize = argSize;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; memcpy(pThreadStruct[i].arg, arg, argSize);<br>
<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; pThreadStruct[i].bResult = bAvailable + i;<br>
<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (pthread_create(pThreads + i, NULL, myThreadProc, pThreadStruct + i) != 0)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // reset to be available.<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bAvailable[i] = true;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return true;<br>
&nbsp;&nbsp; &nbsp;}<br>
<br>
&nbsp;&nbsp; &nbsp;virtual ~ThreadPool()<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; delete []pThreads;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; delete []bAvailable;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m_nThreads; i ++)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delete [] pThreadStruct[i].arg;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; delete []pThreadStruct;<br>
&nbsp;&nbsp; &nbsp;}<br>
private:<br>
&nbsp;&nbsp; &nbsp;pthread_t* pThreads;<br>
&nbsp;&nbsp; &nbsp;bool *bAvailable;<br>
&nbsp;&nbsp; &nbsp;ThreadStruct* pThreadStruct;<br>
&nbsp;&nbsp; &nbsp;int m_nThreads;<br>
};<br>
<br>
struct MyMsgBuf<br>
{<br>
&nbsp;&nbsp; &nbsp;long msgType;<br>
&nbsp;&nbsp; &nbsp;char msg[256];<br>
};<br>
<br>
void handleErrno()<br>
{<br>
&nbsp;&nbsp; &nbsp;switch (errno)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;case EACCES:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt; "(permission denied)" &lt;&lt; endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;case EEXIST:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "(Queue exists, cannot create)"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;case EIDRM:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "(Queue is marked for deletion)"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;case ENOENT:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;"(Queue does not exist)"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;case ENOMEM:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"(Not enough memory to create queue)"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;case ENOSPC:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"(Maximum queue limit exceeded)"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;default:<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"error unknown"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;}<br>
}<br>
<br>
const int MyMsgBufSize = sizeof(MyMsgBuf) - sizeof(long);<br>
<br>
class MyMsgQ<br>
{<br>
public:<br>
&nbsp;&nbsp; &nbsp;MyMsgQ(char ch = 'N'):m_key(-1), m_queueId(-1), bAvailable(false)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; do<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((m_key = ftok(__FILE__, ch))!= -1)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; if ((m_queueId = msgget(m_key,
IPC_CREAT|0200|0400))!= -1)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bAvailable = true;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch ++;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; handleErrno();<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; while (!bAvailable);<br>
&nbsp;&nbsp; &nbsp;}<br>
<br>
&nbsp;&nbsp; &nbsp;bool sendMsg(char* msg, int size, int nPriority = 128)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (bAvailable &amp;&amp; size &lt; MyMsgBufSize)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyMsgBuf msgBuf;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; msgBuf.msgType = nPriority;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(msgBuf.msg, msg, size);<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (msgsnd(m_queueId, &amp;msgBuf, size, NULL) != -1)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; handleErrno();<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return false;<br>
&nbsp;&nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;bool recvMsg(char* msg, int&amp; size, int nPriority = 128)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (bAvailable)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyMsgBuf msgBuf;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int sizeRecv;<br>
<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((sizeRecv
= msgrcv(m_queueId, &amp;msgBuf, MyMsgBufSize, nPriority, 0)) == -1)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; handleErrno();<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (sizeRecv &lt;= size)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(msg, msgBuf.msg, sizeRecv);<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return false;<br>
&nbsp;&nbsp; &nbsp;}<br>
private:<br>
&nbsp;&nbsp; &nbsp;key_t m_key;<br>
&nbsp;&nbsp; &nbsp;int m_queueId;<br>
&nbsp;&nbsp; &nbsp;bool bAvailable;<br>
};<br>
<br>
void runClient()<br>
{<br>
&nbsp;&nbsp; &nbsp;int counter = 0;<br>
&nbsp;&nbsp; &nbsp;MyMsgQ myMsgQ;<br>
&nbsp;&nbsp; &nbsp;while (true)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; char buffer[256];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "client msg number :"&lt;&lt;counter ++ &lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"please input a valid file name:"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; buffer;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (strcmp(buffer, "quit") == 0)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (myMsgQ.sendMsg(buffer, strlen(buffer)+1))<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt;"successfully sent msg "&lt;&lt; buffer&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;}<br>
}<br>
<br>
void* handleFile(void* arg)<br>
{<br>
&nbsp;&nbsp; &nbsp;char* fileName = (char*) arg;<br>
&nbsp;&nbsp; &nbsp;FILE* stream = fopen(fileName, "r");<br>
&nbsp;&nbsp; &nbsp;if (stream)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; char buffer[256];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; while (!feof(stream))<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int size = fread(buffer, 1, sizeof(buffer) - 1, stream);<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buffer[size] = '\0';<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; buffer;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; fclose(stream);<br>
&nbsp;&nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;return NULL;<br>
}<br>
<br>
<br>
void runServer()<br>
{<br>
&nbsp;&nbsp; &nbsp;MyMsgQ myMsgQ;<br>
&nbsp;&nbsp; &nbsp;ThreadPool threadPool;<br>
&nbsp;&nbsp; &nbsp;while (true)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; char buffer[256];<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; int size = sizeof(buffer) - 1;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (myMsgQ.recvMsg(buffer, size))<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buffer[size] = '\0';<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt;"successfully recv msg "&lt;&lt; buffer&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (threadPool.insertJob(&amp;handleFile, buffer, strlen(buffer) + 1))<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "successfully assign job to
thread"&lt;&lt;endl;<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;}<br>
}<br>
<br>
<br>
void runHelp(char* program)<br>
{<br>
&nbsp;&nbsp; &nbsp;cout&lt;&lt;"usage: "&lt;&lt;program&lt;&lt;" [client|server]" &lt;&lt; endl;<br>
}<br>
<br>
<br>
using namespace std;<br>
<br>
int main(int argc, char** argv)<br>
{<br>
&nbsp;&nbsp; &nbsp;if (argc == 2)<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (stricmp(argv[1], "client") == 0)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; runClient();<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (stricmp(argv[1], "server") == 0)<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; runServer();<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; runHelp(argv[0]);<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;else<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; runHelp(argv[0]);<br>
&nbsp;&nbsp; &nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
<p>กก</p>

<pre></pre>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; <a href="PocketRuler.htm">                  







                       <img src="picture/back.gif" style="border: medium none ;" alt="back.gif (341 bytes)" height="35" width="32"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none ;" alt="up.gif (335 bytes)" height="32" width="35"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none ;" alt="next.gif (337 bytes)" height="35" width="32">          


</p>

</body></html>