一个线程池的例子(一)

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

       线程池在我们日常工作中经常会用到,以前一直都不知道怎么用,今天看了书,写了一个简单的线程池例子。这个例子是基于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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果x来电不显示怎么办 苹果8黑屏没反应怎么办 苹果六s开不了机怎么办 苹果6s突然黑屏怎么办 苹果6s黑屏了怎么办 苹果6s手机黑屏打不开怎么办 苹果6sp手机死机怎么办 苹果6s打不开机怎么办 6s开不了机怎么办 lg背光灯坏了怎么办 苹果6s屏幕变黄怎么办 苹果8背光坏了怎么办 苹果六背光坏了怎么办 苹果5s蓝屏死机怎么办 苹果6s突然黑屏怎么办? 苹果6s经常死机怎么办 苹果6s没有背光怎么办 苹果7白屏死机怎么办 苹果6p屏膜失灵怎么办 苹果7p屏幕卡死怎么办 苹果7p手机死机怎么办 苹果6s死机了怎么办啊 6s死机了关不了怎么办 爱疯7死机了怎么办 苹果11.4系统老死机怎么办 苹果6震动坏了怎么办 苹果6手机死机了怎么办 苹果x耗电太快怎么办 苹果6升级11.3卡怎么办 苹果6splus耗电快怎么办 苹果手机系统升级后反应慢怎么办 苹果8听筒声音小怎么办 苹果6s通话声音小怎么办 苹果手机通讯录丢失了怎么办 苹果换id通讯录没有了怎么办 华为p7 更新重启怎么办 打电话的图标没了怎么办 苹果手机wifi信号弱怎么办 没电脑想装wifi怎么办 阿巴町手表二维码丢了怎么办 儿童手表二维码丢了怎么办