一个线程池的例子(一)
2014-12-26 19:47
260 查看
线程池在我们日常工作中经常会用到,以前一直都不知道怎么用,今天看了书,写了一个简单的线程池例子。这个例子是基于Win32平台的。后面我会给出基于Linux平台和Qt的例子,希望各位多多指教。
def.h
main.cpp
运行截图:
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; }
运行截图:
相关文章推荐
- 一个利用common-pool.jar实现线程池的例子
- 一个线程池的例子(二)
- 转载 一个C#线程池的例子
- 一个线程池的例子(三)
- 线程池的一个例子
- .Net下运用Socket和线程池编写的一个Socket通信例子
- 一个类数据类型的STL例子
- 做一个返回数组的函数(例子)
- 关于Java的RMI编程的一个简单的例子
- 一个简单例子表示fixed functional VS/Assemble VS/HLSI VS的例子
- LINUX下的一个SOCKET编程的例子
- 一个简单的tcp filter的例子
- 一个编译器所支持的异步委托的例子
- 自己实现一个“线程池”
- 非阻塞方式下Socket读取数据的一个例子
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 一个成功的增量SNAPSHOT 例子
- 一个理解wait()与notify()的例子
- 一个通用的动态加载数据例子(IE5,NS6,Mozilla 1.3b)
- 一个典型的例子解决常见的高级Windows程序设计问题