zoukankan      html  css  js  c++  java
  • 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,希望对需要的朋友有帮助!

  • 相关阅读:
    02-NLP-04基于统计的翻译系统-01预处理
    02-NLP-03-LDA主题模型应用
    02-NLP-03-主题模型
    02-NLP-02-从朴素贝叶斯(NB)到语言模型
    02-NLP-02-用朴素贝叶斯完成语种检测
    02-NLP-02-朴素贝叶斯与应用
    linux中安装jdk以及eclipse的安装
    python中matplotlib总结
    请求重定向和请求转发
    javaEE中错误提示 Exception starting filter BackServletFilter java.lang.ClassNotFoundException: tmall.filter.BackServletFilter提示这个错误啊
  • 原文地址:https://www.cnblogs.com/lidabo/p/5405551.html
Copyright © 2011-2022 走看看