• 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上,要求输出结果必须按ABC的顺序显示:ABCABC


     
    分类: windows编程 C++
    第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
    1. #include <stdio.h>     
    2. #include <process.h>     
    3. #include <windows.h>     
    4. #define  g_hThreadEvent(n) g_hThreadEvent##1  
    5.   
    6. unsigned int __stdcall Fun(void *pPM);    
    7. //线程个数  
    8. const int THREAD_NUM = 8;    
    9.   
    10. //循环次数  
    11. const int LOOP = 6;  
    12.   
    13. //互斥事件  
    14. HANDLE g_hThreadEvent[THREAD_NUM];  
    15.   
    16.   
    17. int main()  
    18. {  
    19.     printf(" 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环10 次, 接着再回到主线程又循环 100 次,如此循环50次 ");  
    20.   
    21.     int i = 0 , j;  
    22.     HANDLE hdl[THREAD_NUM];  
    23.   
    24.   
    25.     for (i = 0; i < THREAD_NUM; i++)   
    26.         g_hThreadEvent[i] = CreateEvent(NULL,FALSE,FALSE,NULL);  
    27.   
    28.     //将线程编号作为线程参数传进去,先转换为指针,再转换为整形,  
    29.     for (i = 0; i < THREAD_NUM; i++)   
    30.         hdl[i] = (HANDLE)_beginthreadex(NULL,0,Fun,(void*)i,0,NULL);  
    31.   
    32.       
    33.     SetEvent(g_hThreadEvent[0] );  
    34.   
    35.   
    36.     WaitForMultipleObjects(THREAD_NUM,hdl,TRUE,INFINITE);  
    37.   
    38.     for (i = 0; i < THREAD_NUM; i++)  
    39.     {  
    40.         CloseHandle(hdl[i]);  
    41.         CloseHandle(g_hThreadEvent[i]);  
    42.     }  
    43.   
    44.     return 0;  
    45. }  
    46.   
    47. unsigned int __stdcall Fun(void *pPM)  
    48. {  
    49.     int num = (int)pPM;  
    50.     int i = 0;  
    51.   
    52.     for( i  = 0 ; i< LOOP;i++)  
    53.     {  
    54.         WaitForSingleObject(g_hThreadEvent[num],INFINITE);  
    55.           
    56.         //printf("  线程ID=%d,线程编号是%c ,%d  ",GetCurrentThreadId(),num+'A');     
    57.          printf(" %c ",num+'A');  
    58.   
    59.          if(num+1 == THREAD_NUM )  
    60.              printf("  ");  
    61.           
    62.         SetEvent(g_hThreadEvent[(num+1)%THREAD_NUM]);  
    63.     }  
    64.     return 0;  
    65. }  

     
  • 相关阅读:
    MySQL数据库优化的八种方式(经典必看)
    HTML5之应用缓存---manifest---缓存使用----HTML5的manifest缓存
    ajax方法总结
    十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))
    MySQL主从复制技术(纯干货)
    table不能遗露了tbody
    DOM 之selection
    DOM 其他一些特性
    CSSOM视图模式
    DOM 节点实例操作
  • 原文地址:https://www.cnblogs.com/bb3q/p/4498737.html
Copyright © 2020-2023  润新知