读写锁(Read-Write Lock)的一种实现
2013-08-30 09:20
661 查看
项目中用到了此类,实现了多个线程读、单个线程写的功能,基于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
思想:两个相关的锁,一个用于读,一个用于写。可以多个同时读,但只能一个写。比传统的互斥锁,提高了一定的并发性。
#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
相关文章推荐
- 读写锁(Read-Write Lock)的一种实现
- 读写锁(Read-Write Lock)的一种实现
- 读写锁(Read-Write Lock)的一种实现
- Java并发编程:重入锁(ReentranceLock )、读写锁(ReadWriteLock)代码实现
- 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理
- java5 ReadWriteLock用法--读写锁实现
- java5 ReadWriteLock用法--读写锁实现
- 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理
- linux 下实现高性能读写锁(read/write lock)
- java5 ReadWriteLock用法--读写锁实现
- 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理
- 自己动手实现读写锁(read-write lock)
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- ReentrantReadWriteLock 可重入的读写锁
- 如何用ReentrantReadWriteLock实现读者写者问题,且写者优先级更高
- Java多线程之~~~ReadWriteLock 读写分离的多线程实现
- java 自己实现 ReadWriteLock (一)
- 08____java新特性之读写锁(ReentrantReadWriteLock)
- ReentrantReadWriteLock实现读写锁
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock