00001 // 00002 // http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0009A&L=ATL&P=R6194&D=0&I=-3 00003 // Posted by Pavel Lebedinsky <pll@INFRA2000.COM> 00004 // 00005 #ifndef __Simple_LOCK_H_Included__ 00006 #define __Simple_LOCK_H_Included__ 00007 00008 #include "Windows.h" 00009 00010 class SimpleRWLock 00011 { 00012 long m_nReaders; 00013 long m_nWriters; 00014 00015 public: 00016 SimpleRWLock() 00017 { 00018 m_nReaders = 0; 00019 m_nWriters = 0; 00020 } 00021 00022 static const char *name() { return "VladRWLock"; } 00023 00024 void enter_read(void) 00025 { 00026 for (;;) 00027 { 00028 InterlockedIncrement (&m_nReaders); 00029 if (m_nWriters == 0) break; 00030 InterlockedDecrement (&m_nReaders); 00031 Sleep(0); 00032 } 00033 } 00034 00035 void enter_write(void) 00036 { 00037 for (;;) 00038 { 00039 if (InterlockedCompareExchange (&m_nWriters, 1, 0) == 0) 00040 { 00041 while (m_nReaders != 0) Sleep(0); 00042 break; 00043 } 00044 Sleep(0); 00045 } 00046 } 00047 00048 void leave_read(void) 00049 { 00050 InterlockedDecrement (&m_nReaders); 00051 } 00052 00053 void leave_write(void) 00054 { 00055 InterlockedDecrement (&m_nWriters); 00056 } 00057 }; 00058 #endif // __Simple_LOCK_H_Included__
1.5.5