• Google面试题—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD


     
    分类: windows编程 C++
    有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四 个文件呈如下格式:A:1 2 3 4 1 2....B:2 3 4 1 2 3....C:3 4 1 2 3 4....D:4 1 2 3 4 1....请设计程序。
    1. #include <stdio.h>     
    2. #include <process.h>     
    3. #include <windows.h>   
    4. #include <fstream.h>  
    5. #include <string.h>  
    6.   
    7.   
    8. unsigned int __stdcall Fun(void *pPM);    
    9.   
    10. //线程个数  
    11. const int THREAD_NUM = 4;  
    12. const int FILE_NUM = 4;  
    13.   
    14. ofstream ofile[FILE_NUM];  
    15.   
    16. //某个线程的下一个要写的文件  
    17. int FILE_THREAD[FILE_NUM]={0,1,2,3};  
    18. int NEXT_LOOP[FILE_NUM]={0,1,2,3,};  
    19.   
    20. CRITICAL_SECTION g_csFile;  
    21.   
    22. //循环次数  
    23. const int LOOP = 6;  
    24.   
    25. //互斥事件  
    26. HANDLE g_hThreadEvent[THREAD_NUM];  
    27.   
    28.   
    29. int main()  
    30. {  
    31.     printf(" 有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2 ");  
    32.     printf("以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式 ");  
    33.   
    34.     int i = 0 , j;  
    35.     HANDLE hdl[THREAD_NUM];  
    36.     InitializeCriticalSection(&g_csFile);  
    37.   
    38.     //事件开启的时候是没有触发的  
    39.     for (i = 0; i < THREAD_NUM; i++)   
    40.         g_hThreadEvent[i] = CreateEvent(NULL,FALSE,FALSE,NULL);  
    41.   
    42.     //将线程编号作为线程参数传进去,先转换为指针,再转换为整形,  
    43.       
    44.     char FILE_THREAD[] ="A.txt";  
    45.   
    46.     for (i = 0; i < FILE_NUM; i++)   
    47.     {  
    48.   
    49.         FILE_THREAD[0] = i + 'A';  
    50.         ofile[i].open(FILE_THREAD,ios::trunc);  
    51.   
    52.         if(ofile[i].fail())  
    53.         {  
    54.             printf("打开文件%s 失败",FILE_THREAD);  
    55.             continue;  
    56.         }  
    57.     }  
    58.   
    59.     for (i = 0; i < THREAD_NUM; i++)   
    60.         hdl[i] = (HANDLE)_beginthreadex(NULL,0,Fun,(void*)i,0,NULL);  
    61.   
    62.   
    63.     //触发第一个线程,线程函数会按顺序自己触发下一个要执行的线程  
    64.     SetEvent( g_hThreadEvent[0] );  
    65.   
    66.   
    67.     WaitForMultipleObjects(THREAD_NUM,hdl,TRUE,INFINITE);  
    68.   
    69.     //清理  
    70.     for (i = 0; i < THREAD_NUM; i++)  
    71.     {  
    72.         CloseHandle(hdl[i]);  
    73.         CloseHandle(g_hThreadEvent[i]);  
    74.     }  
    75.   
    76.     for( i  = 0 ; i< FILE_NUM;i++)  
    77.     {  
    78.         ofile[i].close();  
    79.     }  
    80.     DeleteCriticalSection(&g_csFile);  
    81.   
    82.     return 0;  
    83. }  
    84.   
    85. unsigned int __stdcall Fun(void *pPM)  
    86. {  
    87.   
    88.     int num = (int)pPM ;  
    89.     int i = 0;  
    90.     for( i  = 0 ; i< LOOP;i++)  
    91.     {  
    92.         //等待顺序触发  
    93.         WaitForSingleObject(g_hThreadEvent[num],INFINITE);        
    94.       
    95.         EnterCriticalSection(&g_csFile);  
    96.       
    97.         printf("  线程 %d 正在向%c文件写入,下一次对文件%c操作的是线程%d ",  
    98.             num + 1 , FILE_THREAD[num] + 'A',FILE_THREAD[num] + 'A',(num+1)%(THREAD_NUM) +1);  
    99.   
    100.         ofile[FILE_THREAD[num]]<<num+1<<" ";  
    101.   
    102.         Sleep(200);  
    103.   
    104.         //记录下一轮对应序号要操作的文件, (num+1)%(FILE_NUM) 事件对应的线程,操作文件FILE_THREAD[num]  
    105.         NEXT_LOOP[ (num+1)%(FILE_NUM) ] = FILE_THREAD[num] ;  
    106.   
    107.         if( num + 1 == FILE_NUM)  
    108.         {  
    109.             printf(" ");  
    110.             //本轮写入结束,将计算好的下一轮文件操作顺序取过来  
    111.             memcpy(&FILE_THREAD,&NEXT_LOOP,FILE_NUM *sizeof(int));  
    112.         }  
    113.           
    114.         LeaveCriticalSection(&g_csFile);       
    115.           
    116.         //触发下一个线程,1触发2 ,2触发3,3触发4,4触发1  
    117.         SetEvent(g_hThreadEvent[(num+1)%THREAD_NUM ]);  
    118.     }  
    119.     return 0;  
    120. }  


  • 相关阅读:
    GRIDVIEW导出到EXCEL
    .NET GRIDVIEW导出EXCEL
    C#自动列宽
    vue 路由跳转及传值和取值
    vue 部署windows nginx服务上
    vue多个代理配置vue.config
    mock常用规则
    git基础篇-常见错误
    git基础篇-使用教程
    win10 gitserver搭建
  • 原文地址:https://www.cnblogs.com/bb3q/p/4498734.html
Copyright © 2020-2023  润新知