- Readers Writers - Writer thread always stuck with multiple reader thread
- #include <stdio.h>
- #include <conio.h>
- #include <windows.h>
- HANDLE mutex, wrt;
- int g_ReadCount = 0;
- int g_GlobalData=0;
- const int max = 2;
- HANDLE reader[max], writer[max];
- CRITICAL_SECTION rSect, wSect;
- bool bTerminate = true;
- DWORD Readers(LPVOID lpdwThreadParam )
- {
- while(bTerminate)
- {
- WaitForSingleObject(mutex, INFINITE);
- g_ReadCount++;
- if(g_ReadCount == 1)
- {
- WaitForSingleObject(wrt, INFINITE);
- }
- ReleaseMutex(mutex);
- EnterCriticalSection(&wSect);
- printf("ThreadId : %d --> Read data : %d ReaderCount %dn", GetCurrentThreadId(), g_GlobalData, g_ReadCount);
- LeaveCriticalSection(&wSect);
- WaitForSingleObject(mutex, INFINITE);
- g_ReadCount--;
- if(g_ReadCount == 0)
- {
- ReleaseMutex(wrt);
- printf("ThreadId : %d Realesed Mutex wrtn", GetCurrentThreadId());
- }
- printf("ThreadId : %d ReaderCount %dn", GetCurrentThreadId(), g_ReadCount);
- ReleaseMutex(mutex);
- printf("Reader ThreadId : %d Realesed Mutex mutexn", g_ReadCount);
- Sleep(0);
- }
- return 0;
- }
- DWORD Writers(LPVOID lpdwThreadParam )
- {
- int n = GetCurrentThreadId();
- int temp = 1;
- while(bTerminate)
- {
- printf("ThreadId : %d Waiting for WRTn", GetCurrentThreadId());
- WaitForSingleObject(wrt, INFINITE);
- printf("WRITER ThreadId : %d ***Got WRTn", GetCurrentThreadId());
- ++n;
- temp++;
- if(temp == 100)
- {
- //bTerminate = false;
- }
- EnterCriticalSection(&wSect);
- printf("Write by ThreadId : %d Data : %d Temp %dn", GetCurrentThreadId(), n, temp);
- g_GlobalData = n;
- LeaveCriticalSection(&wSect);
- ReleaseMutex(wrt);
- }
- printf("***VVV***Exiting Writer Threadn");
- return 0;
- }
- void main()
- {
- mutex = CreateMutex(NULL, false, "Writer");
- wrt = CreateMutex(NULL, false, "wrt");
- InitializeCriticalSection(&rSect);
- InitializeCriticalSection(&wSect);
- DWORD dwThreadId = 0;
- for(int i=0; i < max; i++)
- {
- reader[i] = CreateThread(NULL, //Choose default security
- 0, //Default stack size
- (LPTHREAD_START_ROUTINE)&Readers,
- //Routine to execute
- (LPVOID) 0, //Thread parameter
- 0, //Immediately run the thread
- &dwThreadId //Thread Id
- );
- }
- for(int i=0; i < 1; i++)
- {
- writer[i] = CreateThread(NULL, //Choose default security
- 0, //Default stack size
- (LPTHREAD_START_ROUTINE)&Writers,
- //Routine to execute
- (LPVOID) 0, //Thread parameter
- 0, //Immediately run the thread
- &dwThreadId //Thread Id
- );
- }
- getchar();
- }