多个线程互同步问题

 

  
  
  
  
  1. #include <windows.h> 
  2. #include <stdio.h> 
  3.  
  4. #define NUMTHREADS 3 
  5. #define BUFFER_SIZE 16 
  6. #define FOR_TIMES 5 
  7.  
  8. HANDLE hWriteEvents[NUMTHREADS]; 
  9. HANDLE hReadEvents[NUMTHREADS]; 
  10. BYTE lpSharedBuffer[16]={0}; 
  11.  
  12. void MultiEvents(void); 
  13. VOID WriteToBuffer(VOID); 
  14.  
  15. DWORD WINAPI ThreadFunction(LPVOID lpParam); 
  16.  
  17. int main(){ 
  18.     MultiEvents(); 
  19.  
  20. void MultiEvents(void){ 
  21.     HANDLE hThread; 
  22.     DWORD i; 
  23.     for(i=0;i<NUMTHREADS;i++){ 
  24.         hWriteEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL); 
  25.         if(hWriteEvents[i]==NULL){ 
  26.             printf("CreateEvent failed.(%d)\n",GetLastError()); 
  27.             return
  28.         } 
  29.         hReadEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL); 
  30.         if(hReadEvents[i]==NULL){ 
  31.             printf("CreateEvent failed.(%d)\n",GetLastError()); 
  32.             return
  33.         } 
  34.         hThread = CreateThread(NULL,0,ThreadFunction,i,0,NULL); 
  35.         if(hThread == NULL){ 
  36.             printf("CreateThread failed.(%d)\n",GetLastError()); 
  37.             return
  38.         } 
  39.     } 
  40.     WriteToBuffer(); 
  41.  
  42. VOID WriteToBuffer(VOID){ 
  43.     DWORD dwWaitResult,i,j; 
  44.     for(j=0;j<FOR_TIMES;j++){ 
  45.         Sleep(rand()%100); 
  46.         wsprintf(lpSharedBuffer,"shared %d",j); 
  47.         for(i=0;i<NUMTHREADS;i++){ 
  48.             if(!SetEvent(hWriteEvents[i])){ 
  49.                 printf("SetEvent failed.(%d)\n",GetLastError()); 
  50.                 return
  51.             } 
  52.         } 
  53.         dwWaitResult = WaitForMultipleObjects(NUMTHREADS,hReadEvents,TRUE,INFINITE); 
  54.         if(dwWaitResult != WAIT_OBJECT_0){ 
  55.             printf("Wait error.(%d)\n",GetLastError()); 
  56.             ExitProcess(0); 
  57.         } 
  58.     } 
  59.  
  60. DWORD WINAPI ThreadFunction(LPVOID lpParam){ 
  61.     DWORD dwWaitResult; 
  62.     BYTE lpRead[16]; 
  63.     DWORD j = 0; 
  64.     DWORD dwThreadIndex = (DWORD)lpParam; 
  65.     for(j=0;j<FOR_TIMES;j++){ 
  66.         dwWaitResult = WaitForSingleObject(hWriteEvents[dwThreadIndex],INFINITE); 
  67.         switch (dwWaitResult){ 
  68.         case WAIT_OBJECT_0: 
  69.             Sleep(rand()%10); 
  70.             CopyMemory(lpRead,lpSharedBuffer,16); 
  71.             break
  72.         default
  73.             printf("Wait error:%d\n",GetLastError()); 
  74.             return 0; 
  75.         } 
  76.         printf("线程%u\t第%d次读,内容:%s\n",dwThreadIndex,j,(LPSTR)lpRead); 
  77.     } 
  78.     return 1; 

 

你可能感兴趣的:(多线程,同步,职场,休闲)