您的位置:首页 > 其它

一个线程池的例子(一)

2014-12-26 19:47 260 查看
线程池在我们日常工作中经常会用到,以前一直都不知道怎么用,今天看了书,写了一个简单的线程池例子。这个例子是基于Win32平台的。后面我会给出基于Linux平台和Qt的例子,希望各位多多指教。

def.h

#include <stdio.h>
#include <vector>
#include <Windows.h>
#include <iostream>

using namespace std;

struct Task
{
long m_StartValue;
long m_EndValue;
long m_MinResultValue;
long m_MaxResultValue;
__int64 m_SumResultValue;

Task()
{
m_StartValue = 0;
m_EndValue = 0;
m_MinResultValue = 0;
m_MaxResultValue = 0;
m_SumResultValue = 0;
}

Task &operator=(const Task &T)
{
if (this != &T)
{
m_StartValue = T.m_StartValue;
m_EndValue = T.m_EndValue;
m_MinResultValue = T.m_MinResultValue;
m_MaxResultValue = T.m_MaxResultValue;
m_SumResultValue = T.m_SumResultValue;
}

return *this;
}
};

main.cpp

#include "def.h"
#include <process.h>

vector<Task> g_TaskList;
int g_TaskCount = 0;
HANDLE g_TaskStartEvent;
HANDLE g_TaskFinishEvent;
CRITICAL_SECTION g_CSTask;

void Init()
{
InitializeCriticalSection(&g_CSTask);
g_TaskStartEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
g_TaskFinishEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

for (int i = 0; i < 50; i++)
{
Task T;
T.m_StartValue = i * 1000;
T.m_EndValue = (i + 1) * 1000 * 100;
g_TaskList.push_back(T);
}

g_TaskCount = g_TaskList.size();
}

void DeInit()
{
DeleteCriticalSection(&g_CSTask);
CloseHandle(g_TaskStartEvent);
CloseHandle(g_TaskFinishEvent);
}

bool IsPrime(unsigned long n)
{
if (n == 2)
{
return true;
}

if (n % 2 == 0 || n < 2)
{
return false;
}

long tmp = (int)sqrt((double)n);
for (long i = 3; i <= tmp; i += 2)
{
if (n % i == 0)
{
return false;
}
}

return true;
}

void CalCulatePrime(Task& T)
{
long PrimesCount = 0;

for (long i = T.m_StartValue; i < T.m_EndValue; i++)
{
if (IsPrime(i))
{
PrimesCount++;

if (PrimesCount == 1)
{
T.m_MinResultValue = i;
}

T.m_SumResultValue = T.m_SumResultValue + (__int64)i;
}
}

PrimesCount = 0;
for (long i = T.m_EndValue - 1; i >= T.m_StartValue; i--)
{
if (IsPrime(i))
{
PrimesCount++;

if (PrimesCount == 1)
{
T.m_MaxResultValue = i;
break;
}
}
}

}

DWORD __stdcall ThreadFunc(void *Param)
{
while(g_TaskCount == 0)
{
if(WAIT_OBJECT_0 == WaitForSingleObject(g_TaskStartEvent, INFINITE))
{
ResetEvent(g_TaskStartEvent);
}
}

while(1)
{

if(g_TaskList.size() == 0)
{
break;
}

EnterCriticalSection(&g_CSTask);
Task T = g_TaskList.at(0);
g_TaskList.erase(g_TaskList.begin());
LeaveCriticalSection(&g_CSTask);

CalCulatePrime(T);

printf("ThreadID: %d, Start: %ld, End: %ld, MinResult: %ld, MaxResult: %ld, SumResult: %I64d\n",
GetCurrentThreadId(), T.m_StartValue, T.m_EndValue, T.m_MinResultValue, T.m_MaxResultValue,
T.m_SumResultValue);

EnterCriticalSection(&g_CSTask);
g_TaskCount--;
if (g_TaskCount == 0)
{
SetEvent(g_TaskFinishEvent);
LeaveCriticalSection(&g_CSTask);
break;
}
LeaveCriticalSection(&g_CSTask);
}

return NULL;
}

int main(int argc, char **argv)
{
DWORD ThreadID[8];
HANDLE WorkThread[8];
for (int i = 0; i < 8; i++)
{
WorkThread[i] = CreateThread(NULL, 0, ThreadFunc, NULL, 0, &ThreadID[i]);
}

Init();
SetEvent(g_TaskStartEvent);

while(g_TaskCount > 0)
{
if(WAIT_OBJECT_0 == WaitForSingleObject(g_TaskFinishEvent, INFINITE))
{
ResetEvent(g_TaskFinishEvent);
}
}

DeInit();
system("pause");
return 0;
}

运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: