一个线程池的例子(一)

来源:互联网 发布:双色球篮球 算法 编辑:程序博客网 时间:2024/06/03 00:20

       线程池在我们日常工作中经常会用到,以前一直都不知道怎么用,今天看了书,写了一个简单的线程池例子。这个例子是基于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;}

运行截图:

 

0 0