线程池的编码实现[1] 软件测试工具
关键字:数据库设计下面以一个简单的服务器为例来实现上述算法。假设客户端向服务器发送一个“Hello!”字符串,服务器收到后判断一下是不是“Hello!”这个字符串,如果是则发回一个“OK”字符串给客户端。
下面给出线程池调度管理的编码实现。
#define MAX_QUEUE_SIZE 4 096
#define MAX_LISTEN_SIZE 16
#define MAX_THREADS 10
#define DEFAULT_PORT 8 080
MSGQUEUE *g_pQue;
void ProcessRequest(void *args);
/** 初始化函数,初始化时会先创建消息队列,并预创建MAX_THREADS个线程
@return INT——返回CAPI_FAILED表示失败;返回CAPI_SUCCESS表示成功
*/
INT Init()
{
INT i;
g_pQue = MsgQueue_Create(MAX_QUEUE_SIZE);
if ( g_pQue == NULL )
{
return CAPI_FAILED;
}
for ( i = 0;i < MAX_THREADS;i++ )
{
_beginthread(ProcessRequest, 0, NULL);
}
return CAPI_SUCCESS;
}
/** 接收请求的处理函数,实现将接收请求的SOCKET标识符放入到消息队列中
@return INT——返回CAPI_FAILED表示失败;返回CAPI_SUCCESS表示成功
*/
INT RecvQuest()
{
struct sockaddr_in local, from;
SOCKET s, msgsock;
int fromlen;
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
return CAPI_FAILED;
}
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(DEFAULT_PORT);
if ( bind(s, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)
{
return CAPI_FAILED;
}
if ( listen(s, MAX_LISTEN_SIZE ) == SOCKET_ERROR)
{
return CAPI_FAILED;
}
while( msgsock = aclearcase/" target="_blank" >ccept(s, (struct sockaddr*)&from, &fromlen)
!= INVALID_SOCKET )
{
SOCKET *pNewSock = new SOCKET;
*pNewSock = msgsock;
/* 事实上可放更多信息到消息队列中,这里放一个SOCK ID示意一下 */
MsgQueue_Send(g_pQue, (void *)pNewSock);
}
return CAPI_SUCCESS;
}
/** 处理请求的任务处理函数,这个函数是处理任务的入口函数,在里面处理接收客户端
发来的字符串“Hello!”并发送响应“OK”到客户端