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.   
  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,希望对需要的朋友有帮助!

原文地址:https://www.cnblogs.com/lidabo/p/5405551.html