一个线程池的例子(三)
来源:互联网 发布:java do while循环语句 编辑:程序博客网 时间:2024/05/18 05:37
在Linux下,我们使用pthread线程库来进行线程编程,下面是一个线程池的简单例子,还望各位多多指教。
main.cpp
/* * main.cpp * * Created on: 2014年12月14日 * Author: Richard */#include <pthread.h>#include <stdio.h>#include <vector>#include <iostream>#include <math.h>using namespace std;struct Task{ long m_StartValue; long m_EndValue; long m_MinResultValue; long m_MaxResultValue; long long 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; }};vector<Task> g_TaskList;pthread_cond_t g_CondFinished;pthread_mutex_t g_TaskMutex;pthread_cond_t g_CondStart;int g_TaskCount = 0;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 + (long long)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; } } }}void *ThreadFunc(void *){ pthread_mutex_lock(&g_TaskMutex); while (g_TaskCount == 0) { pthread_cond_wait(&g_CondStart, &g_TaskMutex); } pthread_mutex_unlock(&g_TaskMutex); while(1) { if (g_TaskList.size() == 0) { break; } pthread_mutex_lock(&g_TaskMutex); Task T = g_TaskList.at(0); g_TaskList.erase(g_TaskList.begin()); pthread_mutex_unlock(&g_TaskMutex); CalCulatePrime(T); printf("ThreadID: %lu, Start: %ld, End: %ld, MinResult: %ld, MaxResult: %ld, SumResult: %lld\n", pthread_self(), T.m_StartValue, T.m_EndValue, T.m_MinResultValue, T.m_MaxResultValue, T.m_SumResultValue); pthread_mutex_lock(&g_TaskMutex); g_TaskCount--; if (g_TaskCount == 0) { pthread_cond_signal(&g_CondFinished); pthread_mutex_unlock(&g_TaskMutex); break; } pthread_mutex_unlock(&g_TaskMutex); } return NULL;}int main(int argc, char **argv) { pthread_mutex_init(&g_TaskMutex, NULL); pthread_cond_init(&g_CondStart, NULL); pthread_cond_init(&g_CondFinished, NULL); pthread_t ThreadID[8]; for (int i = 0; i < 8; i++) { pthread_create(&ThreadID[i], NULL, ThreadFunc, 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++; } pthread_mutex_lock(&g_TaskMutex); pthread_cond_broadcast(&g_CondStart); pthread_mutex_unlock(&g_TaskMutex); pthread_mutex_lock(&g_TaskMutex); while(g_TaskCount > 0) { pthread_cond_wait(&g_CondFinished, &g_TaskMutex); } pthread_mutex_unlock(&g_TaskMutex); for(int i = 0; i < 8; i++) { pthread_join(ThreadID[i], NULL); } pthread_mutex_destroy(&g_TaskMutex); pthread_cond_destroy(&g_CondFinished); pthread_cond_destroy(&g_CondStart); return 0;}运行截图
0 0
- 一个线程池的例子(三)
- 一个线程池的例子(一)
- 一个线程池的例子(二)
- 线程池的一个例子
- 转载 一个C#线程池的例子
- 使用java线程池的一个例子
- MVC入门的一个例子(三)
- 一个“线程不安全”的例子
- 一个简单的线程例子
- 一个线程死锁的例子
- 一个简单的线程例子
- 一个线程死锁的例子
- 由一个线程例子引发的思考(转载)
- 一个简单的线程中断的例子
- C#中的一个线程同步的例子
- java中的线程死锁的一个例子
- 一个使用线程计数器的例子
- java线程的一个小例子
- Subsets -- Leetcode
- 创建型模式--(再论)单例模式
- C#调用SAPI实现语音合成的两种方法
- 三星 wifi 登录至 无线网络 解决
- MyMathLib系列(行列式计算4--向量部分)
- 一个线程池的例子(三)
- Linux - 上传项目到SVN分支
- 2014年12月26日
- 16Sending the User to Another App(隐式Intent意图)
- c++ 第三章4
- 2014年12月27日
- BNU新生赛总结
- java IO--获取指定目录下(包含子目录)指定拓展名的文件
- Linux - Git使用方法-下载子模块