#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <queue>
#include <cstdlib>
using namespace std;
queue<Request*> qTask;
CRITICAL_SECTION g_cs;
bool bExit0 = false;
DWORD CALLBACK RetreiveWorkThread(LPVOID p)
{
Request* pRequest = NULL;
while ( (pRequest = GetRequest()))
{
EnterCriticalSection(&g_cs);
qTask.push(pRequest);
LeaveCriticalSection(&g_cs);
}
bExit0 = true;
ExitThread(0);
return 0;
}
DWORD CALLBACK WorkerThread(LPVOID p)
{
while (true)
{
EnterCriticalSection(&g_cs);
if (qTask.empty())
{
LeaveCriticalSection(&g_cs);
if (bExit0)
break;
continue;
}
if (!q.empty())
{
Request* pRequest = qTask.pop();
try
{
ProcessRequest(pRequest);
}catch(...)
{
}
delete pRequest;
}
LeaveCriticalSection(&g_cs);
}
ExitThread(0);
return 0;
}
int main()
{
InitializeCriticalSection(&g_cs);
HANDLE threads[] =
{
CreateThread(NULL,0, RetreiveWorkThread,NULL, 0, NULL),
CreateThread(NULL,0, WorkerThread, NULL, 0, NULL)
};
WaitForMultipleObjects(sizeof(threads) / sizeof(HANDLE), threads, TRUE, INFINITE);
DeleteCriticalSection(&g_cs);
system("pause");
return 0;
}
#include <windows.h>
#include <iostream>
#include <queue>
#include <cstdlib>
using namespace std;
queue<Request*> qTask;
CRITICAL_SECTION g_cs;
bool bExit0 = false;
DWORD CALLBACK RetreiveWorkThread(LPVOID p)
{
Request* pRequest = NULL;
while ( (pRequest = GetRequest()))
{
EnterCriticalSection(&g_cs);
qTask.push(pRequest);
LeaveCriticalSection(&g_cs);
}
bExit0 = true;
ExitThread(0);
return 0;
}
DWORD CALLBACK WorkerThread(LPVOID p)
{
while (true)
{
EnterCriticalSection(&g_cs);
if (qTask.empty())
{
LeaveCriticalSection(&g_cs);
if (bExit0)
break;
continue;
}
if (!q.empty())
{
Request* pRequest = qTask.pop();
try
{
ProcessRequest(pRequest);
}catch(...)
{
}
delete pRequest;
}
LeaveCriticalSection(&g_cs);
}
ExitThread(0);
return 0;
}
int main()
{
InitializeCriticalSection(&g_cs);
HANDLE threads[] =
{
CreateThread(NULL,0, RetreiveWorkThread,NULL, 0, NULL),
CreateThread(NULL,0, WorkerThread, NULL, 0, NULL)
};
WaitForMultipleObjects(sizeof(threads) / sizeof(HANDLE), threads, TRUE, INFINITE);
DeleteCriticalSection(&g_cs);
system("pause");
return 0;
}