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

简介: 在做项目的过程中有时候为了提升效率,用了多线程的方法来对任务进行分割和应用,后来发现,采用线程池的方法能更好的利用线程资源来计算任务,网上有很多关于如何运行线程池的例子,msdn上也给出了对应的例子:https://msdn.

在做项目的过程中有时候为了提升效率,用了多线程的方法来对任务进行分割和应用,后来发现,采用线程池的方法能更好的利用线程资源来计算任务,网上有很多关于如何运行线程池的例子,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.   
  5. using namespace std;  
  6.   
  7. #define THREAD_NUM 10  
  8.   
  9. struct tempStruct  
  10. {  
  11.     int a;  
  12.     int b;  
  13. };  
  14.   
  15. VOID CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance,void* Context);  
  16. VOID CALLBACK WorkCallbackTemp(PTP_CALLBACK_INSTANCE Instance, void* Context, PTP_WORK Work);  
  17.   
  18. void main()  
  19. {  
  20.     PTP_WORK tpWork[THREAD_NUM];  
  21.     tempStruct transferStruct[THREAD_NUM];  
  22.   
  23.     for ( int i = 0; i< THREAD_NUM; i++ )  
  24.     {  
  25.         transferStruct[i].a = i;  
  26.         transferStruct[i].b = i+1;  
  27.     }  
  28.   
  29.     //单次工作提交  
  30.     TrySubmitThreadpoolCallback(SimpleCallback,&transferStruct[2],NULL);  
  31.   
  32.     for ( int i = 0; i< THREAD_NUM; i++ )  
  33.         tpWork[i] = CreateThreadpoolWork(WorkCallbackTemp,&transferStruct[i],NULL);  
  34.   
  35.     //提交工作  
  36.     for ( int i = 0; i< THREAD_NUM; i++ )  
  37.         SubmitThreadpoolWork(tpWork[i]);  
  38.   
  39.     //等待工作结束  
  40.     for ( int i = 0; i< THREAD_NUM; i++ )  
  41.         WaitForThreadpoolWorkCallbacks(tpWork[i],false);  
  42.   
  43.     //关闭工作对象  
  44.     for ( int i = 0; i< THREAD_NUM; i++ )  
  45.         CloseThreadpoolWork(tpWork[i]);   
  46.   
  47.     system("pause");  
  48. }  
  49.   
  50. VOID CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance,void* Context)  
  51. {  
  52.     tempStruct *pt = (tempStruct *)Context;  
  53.   
  54.     int pruduct = pt->a * pt->b;  
  55.     cout <<"Simple struct a: "<<pt->a<<" struct_temp.b: "<<pt->b<<" pruduct: "<<pruduct<<endl;  
  56. }  
  57.   
  58. VOID CALLBACK WorkCallbackTemp(PTP_CALLBACK_INSTANCE Instance, void* Context, PTP_WORK Work)  
  59. {  
  60.     tempStruct *pt = (tempStruct *)Context;  
  61.   
  62.     int sum = pt->a + pt->b;  
  63.     cout <<"Work struct a: "<<pt->a<<" struct_temp.b: "<<pt->b<<" sum: "<<sum<<endl;  
  64. }  

 

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

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

目录
相关文章
|
2月前
|
消息中间件 前端开发 Java
美团面试:如何实现线程任务编排?
线程任务编排指的是对多个线程任务按照一定的逻辑顺序或条件进行组织和安排,以实现协同工作、顺序执行或并行执行的一种机制。 ## 1.线程任务编排 VS 线程通讯 有同学可能会想:那线程的任务编排是不是问的就是线程间通讯啊? 线程间通讯我知道了,它的实现方式总共有以下几种方式: 1. Object 类下的 wait()、notify() 和 notifyAll() 方法; 2. Condition 类下的 await()、signal() 和 signalAll() 方法; 3. LockSupport 类下的 park() 和 unpark() 方法。 但是,**线程通讯和线程的任务编排是
35 1
|
6天前
|
缓存 Java 调度
Java并发编程:深入解析线程池与Future任务
【7月更文挑战第9天】线程池和Future任务是Java并发编程中非常重要的概念。线程池通过重用线程减少了线程创建和销毁的开销,提高了资源利用率。而Future接口则提供了检查异步任务状态和获取任务结果的能力,使得异步编程更加灵活和强大。掌握这些概念,将有助于我们编写出更高效、更可靠的并发程序。
|
5天前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
17 1
|
11天前
|
安全 开发者
LabVIEW程序退出后线程仍在运行问题
LabVIEW程序退出后线程仍在运行问题
17 2
|
14天前
|
Shell Linux 开发工具
解决windows系统下运行.sh文件
【6月更文挑战第15天】
29 4
|
18天前
|
Java
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
11 1
|
18天前
|
存储 测试技术
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
29 0
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
|
27天前
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
30 3
|
26天前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
|
5天前
|
设计模式 安全 Java
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
9 0