读写锁(Read-Write Lock)的一种实现

项目中用到了此类,实现了多个线程读、单个线程写的功能,基于Windows平台。

思想:两个相关的锁,一个用于读,一个用于写。可以多个同时读,但只能一个写。比传统的互斥锁,提高了一定的并发性。

 

  
  
  
  
  1. #ifndef READER_WRITER_LOCK_H_   
  2. #define READER_WRITER_LOCK_H_   
  3. /*************************************************************   
  4. /* Multi-reader Single-writer class   
  5. /* author: http://vcsky.net 2011/05/18   
  6. /* author: http://www.it165.net 2011/05/18   
  7. **************************************************************/   
  8. #include "windows.h"  
  9.  
  10. class CReaderWriterLock   
  11. {   
  12. public:   
  13.     CReaderWriterLock()   
  14.     {   
  15.         m_Readers = 0;   
  16.         InitializeCriticalSection(&m_Writer);   
  17.         InitializeCriticalSection(&m_ReaderCount);   
  18.         m_ClearReadersEvent = CreateEvent(NULL,TRUE,TRUE,NULL);   
  19.     }  
  20.  
  21.     ~CReaderWriterLock()   
  22.     {   
  23.         WaitForSingleObject(m_ClearReadersEvent,INFINITE);   
  24.         CloseHandle(m_ClearReadersEvent);   
  25.         DeleteCriticalSection(&m_Writer);   
  26.         DeleteCriticalSection(&m_ReaderCount);   
  27.     }  
  28.  
  29.     /*Read, reset events */   
  30.     void EnterReader(void)   
  31.     {   
  32.         EnterCriticalSection(&m_Writer);   
  33.         EnterCriticalSection(&m_ReaderCount);   
  34.         if (++m_Readers == 1)   
  35.         {   
  36.             ::ResetEvent(m_ClearReadersEvent);   
  37.         }   
  38.         LeaveCriticalSection(&m_ReaderCount);   
  39.         LeaveCriticalSection(&m_Writer);   
  40.     }  
  41.  
  42.     /*leave read, triggered events */   
  43.     void LeaveReader(void)   
  44.     {   
  45.         EnterCriticalSection(&m_ReaderCount);   
  46.         if (--m_Readers == 0)   
  47.         {   
  48.             ::SetEvent(m_ClearReadersEvent);   
  49.         }   
  50.         LeaveCriticalSection(&m_ReaderCount);   
  51.     }  
  52.  
  53.     /*Only after reading, to be able to write*/   
  54.     void EnterWriter(void)   
  55.     {   
  56.         EnterCriticalSection(&m_Writer);   
  57.         WaitForSingleObject(m_ClearReadersEvent,INFINITE);   
  58.     }  
  59.  
  60.     void LeaveWriter(void)   
  61.     {   
  62.         LeaveCriticalSection(&m_Writer);   
  63.     }  
  64.  
  65. private:   
  66.     CRITICAL_SECTION m_Writer;   
  67.     CRITICAL_SECTION m_ReaderCount;   
  68.     int m_Readers;   
  69.     HANDLE m_ClearReadersEvent;   
  70. };  
  71.  
  72. #endif 

原文地址:http://www.it165.net/pro/html/201206/2974.html

你可能感兴趣的:(windows,锁,的)