Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 10th, 2012  |  syntax: None  |  size: 2.56 KB  |  hits: 9  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Readers Writers - Writer thread always stuck with multiple reader thread
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5.  
  6. HANDLE mutex, wrt;
  7. int g_ReadCount = 0;
  8. int g_GlobalData=0;
  9.  
  10. const int max = 2;
  11. HANDLE reader[max], writer[max];
  12. CRITICAL_SECTION rSect, wSect;
  13. bool bTerminate = true;
  14.  
  15. DWORD Readers(LPVOID lpdwThreadParam )
  16. {
  17.   while(bTerminate)
  18.   {
  19.     WaitForSingleObject(mutex, INFINITE);
  20.     g_ReadCount++;
  21.     if(g_ReadCount == 1)
  22.     {      
  23.       WaitForSingleObject(wrt, INFINITE);
  24.     }
  25.     ReleaseMutex(mutex);
  26.  
  27.     EnterCriticalSection(&wSect);
  28.     printf("ThreadId : %d --> Read data : %d  ReaderCount %dn", GetCurrentThreadId(), g_GlobalData, g_ReadCount);
  29.     LeaveCriticalSection(&wSect);
  30.  
  31.     WaitForSingleObject(mutex, INFINITE);
  32.     g_ReadCount--;
  33.     if(g_ReadCount == 0)
  34.     {
  35.         ReleaseMutex(wrt);
  36.         printf("ThreadId : %d Realesed Mutex wrtn", GetCurrentThreadId());
  37.     }
  38.     printf("ThreadId : %d ReaderCount %dn", GetCurrentThreadId(), g_ReadCount);
  39.     ReleaseMutex(mutex);
  40.     printf("Reader ThreadId : %d Realesed Mutex mutexn", g_ReadCount);
  41.     Sleep(0);
  42.    }
  43.   return 0;
  44. }
  45.  
  46.  
  47. DWORD Writers(LPVOID lpdwThreadParam )
  48. {
  49.   int n = GetCurrentThreadId();
  50.   int temp = 1;
  51.   while(bTerminate)
  52.   {  
  53.     printf("ThreadId : %d Waiting for WRTn", GetCurrentThreadId());
  54.     WaitForSingleObject(wrt, INFINITE);
  55.     printf("WRITER ThreadId : %d ***Got  WRTn", GetCurrentThreadId());
  56.     ++n;
  57.     temp++;
  58.  
  59.     if(temp == 100)
  60.     {
  61.       //bTerminate = false;
  62.     }
  63.  
  64.     EnterCriticalSection(&wSect);
  65.     printf("Write by ThreadId : %d Data : %d   Temp %dn", GetCurrentThreadId(), n, temp);
  66.     g_GlobalData = n;
  67.     LeaveCriticalSection(&wSect);
  68.     ReleaseMutex(wrt);
  69.   }
  70.  
  71.   printf("***VVV***Exiting Writer Threadn");
  72.   return 0;
  73. }
  74.  
  75. void main()
  76. {
  77.   mutex = CreateMutex(NULL, false, "Writer");
  78.   wrt = CreateMutex(NULL, false, "wrt");
  79.  
  80.   InitializeCriticalSection(&rSect);
  81.   InitializeCriticalSection(&wSect);
  82.   DWORD dwThreadId = 0;
  83.  
  84.  
  85.  
  86.   for(int i=0; i < max; i++)
  87.   {
  88.     reader[i] = CreateThread(NULL, //Choose default security
  89.       0, //Default stack size
  90.       (LPTHREAD_START_ROUTINE)&Readers,
  91.       //Routine to execute
  92.       (LPVOID) 0, //Thread parameter
  93.       0, //Immediately run the thread
  94.       &dwThreadId //Thread Id
  95.       );
  96.   }
  97.  
  98.   for(int i=0; i < 1; i++)
  99.   {
  100.     writer[i] = CreateThread(NULL, //Choose default security
  101.       0, //Default stack size
  102.       (LPTHREAD_START_ROUTINE)&Writers,
  103.       //Routine to execute
  104.       (LPVOID) 0, //Thread parameter
  105.       0, //Immediately run the thread
  106.       &dwThreadId //Thread Id
  107.       );
  108.   }
  109.  
  110.  
  111.   getchar();
  112.  
  113.  
  114. }