線程池的編碼實現[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 = accept(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”到客戶端
文章來源于領測軟件測試網 http://www.kjueaiud.com/