讀寫鎖(Read-Write Lock)的一種實現

項目中用到了此類,實現了多個線程讀、單個線程寫的功能,基於Windows平臺。

思想:兩個相關的鎖,一個用於讀,一個用於寫。可以多個同時讀,但只能一個寫。比傳統的互斥鎖,提高了一定的併發性。

#ifndef READER_WRITER_LOCK_H_
#define READER_WRITER_LOCK_H_
/*************************************************************
/* Multi-reader Single-writer class
/* author: http://vcsky.net 2011/05/18
**************************************************************/
#include "windows.h"

class CReaderWriterLock
{
public:
    CReaderWriterLock()
    {
        m_Readers = 0;
        InitializeCriticalSection(&m_Writer);
        InitializeCriticalSection(&m_ReaderCount);
        m_ClearReadersEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
    }

    ~CReaderWriterLock()
    {
        WaitForSingleObject(m_ClearReadersEvent,INFINITE);
        CloseHandle(m_ClearReadersEvent);
        DeleteCriticalSection(&m_Writer);
        DeleteCriticalSection(&m_ReaderCount);
    }

    /*Read, reset events */
    void EnterReader(void)
    {
        EnterCriticalSection(&m_Writer);
        EnterCriticalSection(&m_ReaderCount);
        if (++m_Readers == 1)
        {
            ::ResetEvent(m_ClearReadersEvent);
        }
        LeaveCriticalSection(&m_ReaderCount);
        LeaveCriticalSection(&m_Writer);
    }

    /*leave read, triggered events */
    void LeaveReader(void)
    {
        EnterCriticalSection(&m_ReaderCount);
        if (--m_Readers == 0)
        {
            ::SetEvent(m_ClearReadersEvent);
        }
        LeaveCriticalSection(&m_ReaderCount);
    }

    /*Only after reading, to be able to write*/
    void EnterWriter(void)
    {
        EnterCriticalSection(&m_Writer);
        WaitForSingleObject(m_ClearReadersEvent,INFINITE);
    }

    void LeaveWriter(void)
    {
        LeaveCriticalSection(&m_Writer);
    }

private:
    CRITICAL_SECTION m_Writer;
    CRITICAL_SECTION m_ReaderCount;
    int m_Readers;
    HANDLE m_ClearReadersEvent;
};

#endif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章