码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-12 22:49:57      阅读:365      评论:0      收藏:0      [点我收藏+]

标签:

 
分类: 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("\t有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2\n");  
  32.     printf("以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式\n");  
  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\n",  
  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("\n");  
  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. }  


技术分享

技术分享

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

标签:

原文地址:http://www.cnblogs.com/bb3q/p/4498734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!