一个线程池的例子(一)

       线程池在我们日常工作中经常会用到,以前一直都不知道怎么用,今天看了书,写了一个简单的线程池例子。这个例子是基于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值