windows下利用线程池完成多任务的分配和运行

在做项目的过程中有时候为了提升效率,用了多线程的方法来对任务进行分割和应用,后来发现,采用线程池的方法能更好的利用线程资源来计算任务,网上有很多关于如何运行线程池的例子,msdn上也给出了对应的例子:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686980(v=vs.85).aspx

感兴趣的话大家可以去看看,这里我给出一个简单的demo,利用线程池单次调用多次调用,例子如下:

[cpp] view plain copy

  1. #include<Windows.h>
  2. #include<iostream>
  3. #include<cstdlib>
  4. using namespace std;
  5. #define THREAD_NUM 10
  6. struct tempStruct
  7. {
  8. int a;
  9. int b;
  10. };
  11. VOID CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance,void* Context);
  12. VOID CALLBACK WorkCallbackTemp(PTP_CALLBACK_INSTANCE Instance, void* Context, PTP_WORK Work);
  13. void main()
  14. {
  15. PTP_WORK tpWork[THREAD_NUM];
  16. tempStruct transferStruct[THREAD_NUM];
  17. for ( int i = 0; i< THREAD_NUM; i++ )
  18. {
  19. transferStruct[i].a = i;
  20. transferStruct[i].b = i+1;
  21. }
  22. //单次工作提交
  23. TrySubmitThreadpoolCallback(SimpleCallback,&transferStruct[2],NULL);
  24. for ( int i = 0; i< THREAD_NUM; i++ )
  25. tpWork[i] = CreateThreadpoolWork(WorkCallbackTemp,&transferStruct[i],NULL);
  26. //提交工作
  27. for ( int i = 0; i< THREAD_NUM; i++ )
  28. SubmitThreadpoolWork(tpWork[i]);
  29. //等待工作结束
  30. for ( int i = 0; i< THREAD_NUM; i++ )
  31. WaitForThreadpoolWorkCallbacks(tpWork[i],false);
  32. //关闭工作对象
  33. for ( int i = 0; i< THREAD_NUM; i++ )
  34. CloseThreadpoolWork(tpWork[i]);
  35. system("pause");
  36. }
  37. VOID CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance,void* Context)
  38. {
  39. tempStruct *pt = (tempStruct *)Context;
  40. int pruduct = pt->a * pt->b;
  41. cout <<"Simple struct a: "<<pt->a<<" struct_temp.b: "<<pt->b<<" pruduct: "<<pruduct<<endl;
  42. }
  43. VOID CALLBACK WorkCallbackTemp(PTP_CALLBACK_INSTANCE Instance, void* Context, PTP_WORK Work)
  44. {
  45. tempStruct *pt = (tempStruct *)Context;
  46. int sum = pt->a + pt->b;
  47. cout <<"Work struct a: "<<pt->a<<" struct_temp.b: "<<pt->b<<" sum: "<<sum<<endl;
  48. }

PS有个网站的教程写得很好,收益很多大家也可以去看看:http://www.cnblogs.com/kzloser/archive/2013/03/11/2909221.html

做个mark,希望对需要的朋友有帮助!

时间: 2024-10-24 19:37:34

windows下利用线程池完成多任务的分配和运行的相关文章

Linux下简单线程池的实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同

linux下的线程池

什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了.如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了. 下面是Linux系统下用C语言创建的一个线程池.线程池会维护一个任务链表(每个CThread_worker结构就是一个任务).   pool_init()函数预先创建好max_thread_num个线程,每个线程执thread_routine ()函

Windows下利用rsync实现邮件服务器数据的同步

Windows下利用rsync实现邮件服务器数据的同步 背景环境 对系统管理员来说,平时的工作重心应该集中在维护 系统正常运转,能够正常提供服务上,这里往往牵涉到 一个数据备份的问题,在我所了解的情况中,有80%的系统管理员不是太关心自己服务器的安全性,但往往对 备份镜像的技术相当感兴趣,但由于商业产品的软硬件价格都相当高昂,因此往往会选择自由软件.rsync就 是这样的软件,它可以满足绝大多数要求不是特 别高的备份需求.适用于数据不是很大,海量小的文件的存储备份,结合服务器本身的磁盘阵列技术,

Python的并发并行[4] -&gt; 并发 -&gt; 利用线程池启动线程

利用线程池启动线程 submit与map启动线程 利用两种方式分别启动线程,同时利用with上下文管理来对线程池进行控制 1 from concurrent.futures import ThreadPoolExecutor as tpe 2 from concurrent.futures import ProcessPoolExecutor as ppe 3 from time import ctime, sleep 4 from random import randint 5 6 def f

windows下游戏服务器端框架Firefly安装说明及demo运行

原地址:http://blog.csdn.net/wangqiuyun/article/details/11150503 本来公司一个网游服务器端选定了pomelo框架,后来出了个Firefly,为做一个对比,决定研究一下Firefly.看了一下Firefly,感觉头大,python的,本人python小白,只好慢慢折腾,一天下来总算装上了Firefly框架,并把他的那个开源网游<暗黑世界>服务器端跑了起来,特此记录共享! 其实关于这个框架的安装,他们的官网和BBS是有教程的只是太零散,并且面

WIndows编程之线程池的使用

不得不说,做C++服务器程序开发,要是不理解线程池,不懂线程池,做C++服务器端的程序就没有任何意义.特别就是上次我因为理解错了线程池而做错了一件事,而被指导人批了一顿,至今记忆犹新,所以趁着周末学了下线程池的使用,小有成绩. 先看一种比较简单的线程池的实现. 1 #include <windows.h> 2 #include <string> 3 #include <iostream> 4 5 using namespace std; 6 7 #define BEGI

C++11下的线程池以及灵活的functional + bind + lamda

利用boost的thread实现一个线程类,维护一个任务队列,以便可以承载非常灵活的调用.这个线程类可以方便的为后面的线程池打好基础.线程池还是动态均衡,没有什么别的.由于minGW 4.7 对 C++11 thread 不支持,所以采用 boost 代替,linux 下是支持的,只是名字空间不同而已,套路都一样.先上代码: [cpp] view plaincopy #include #include <boost/thread/thread.hpp> #include <boost/t

Windows下利用py2exe生成静默运行的命令行程序

py2exe是python的第三方库,可以利用它将你的python脚本编译成可执行文件(exe),而在实际的开发过程中生成的dos窗口很影响用户体验,建议按以下方式让exe静默运行. 首先将你的python脚本后缀名改成:.pyw 再编辑Setup文件: from distutils.core import setup import py2exe setup(windows=['test.pyw']) 这样就成功组建了一个静默运行的python模块. 如果在运行过程中出现“RuntimeErro

一个Linux下C线程池的实现

在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包.这个线程只服务于这个用户 , 当 用户与服务器端关闭连接以后, 服务器端销毁这个线程.然而频繁地开辟与销毁线程极大地占用了系统的资源.而且在大量用户的情况下, 系统为了开辟和销毁线程将浪费大量的时间和资源.线程池提供了一个解决外部大量用户与服务器有限资源的矛盾, 线程池和传统的一个用户对应一个线程的处理方法不同, 它的基本思想就是在程序