一个线程池的例子(一)
来源:互联网 发布:双色球篮球 算法 编辑:程序博客网 时间: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
- 一个线程池的例子(一)
- 一个线程池的例子(二)
- 一个线程池的例子(三)
- 线程池的一个例子
- 转载 一个C#线程池的例子
- 使用java线程池的一个例子
- 一个“线程不安全”的例子
- 一个简单的线程例子
- 一个线程死锁的例子
- 一个简单的线程例子
- 一个线程死锁的例子
- 一个SDL的例子分析(一)
- MVC入门的一个例子(一)
- 由一个线程例子引发的思考(转载)
- 一个简单的线程中断的例子
- 一个epoll例子(一)
- C#中的一个线程同步的例子
- java中的线程死锁的一个例子
- 使用Digester解析XML文档
- 【记录】Android学习笔记(Android工程文件列表简介)
- Maven提高篇系列之五——处理依赖冲突
- [COCI 2013/2014 ROUND 5] ladice
- 6、openldap的OLC配置
- 一个线程池的例子(一)
- 教你如何获取ios系统信息
- 【记录】螺纹连接与螺旋传动
- CAS实现单点登录(SSO)经典完整教程
- Android四大组件----广播发送者与广播接收者的使用
- CAS实现SSO单点登录原理
- 【记录】齿轮三维造型设计
- 数据结构之hash表,HashMap简单实现
- 矩阵链乘法(备忘录法)