#pragma once
#include<mutex>
#include <condition_variable>
class ReadWriteLock
{
public:
ReadWriteLock(void);
~ReadWriteLock(void);
void LockRead(void);
void LockWrite(void);
std::mutex m_lock_writeCount;
std::mutex m_lock_preWriteCount;
std::mutex m_lock_readCount;
int m_readCount;
int m_writeCount;
int m_preWriteCount;
std::condition_variable m_cv;
std::condition_variable m_cvPreWrite;
void UnlockRead(void);
void UnlockWrite(void);
};
#include "stdafx.h"
#include "ReadWriteLock.h"
ReadWriteLock::ReadWriteLock(void)
: m_readCount(0), m_writeCount(0)
{
}
ReadWriteLock::~ReadWriteLock(void)
{
}
void ReadWriteLock::LockRead(void)
{
Loop:
m_lock_preWriteCount.lock();//鎖preWriteCount
m_lock_writeCount.lock();//鎖writeCount
m_lock_readCount.lock();//鎖readCount
if(m_preWriteCount>0||m_writeCount>0){//放入唯一一個讀程序進入預寫與寫判斷的網關
m_lock_preWriteCount.unlock();
m_lock_writeCount.unlock();
m_lock_readCount.unlock();
//這裡可以考慮加入-1信号量2操作(信号量2控制preWriteCount和writeCount)
goto Loop;
}else{//沒有寫操作也沒有預寫操作,則允許放入讀的程序
++m_readCount;//讀程序加1
m_lock_preWriteCount.unlock();
m_lock_writeCount.unlock();
m_lock_readCount.unlock();
}
}
void ReadWriteLock::UnlockRead(void)
{
m_lock_readCount.lock();//完成讀,則讀程序數減一
--m_readCount;
//這裡可以考慮加入+1信号量1操作(信号量1控制writeCount和readCount)
m_lock_readCount.unlock();
}
void ReadWriteLock::LockWrite(void)
{
m_lock_preWriteCount.lock();
++m_preWriteCount;
m_lock_preWriteCount.unlock();//預寫程序加1
Loop:
m_lock_writeCount.lock();
m_lock_readCount.lock();
if(m_writeCount>0||m_readCount>0){//等待所有已進入預寫與寫網關的讀程序結束,等待寫程序結束
m_lock_writeCount.unlock();
m_lock_readCount.unlock();
//這裡可以考慮加入-1信号量1操作
goto Loop;
}else{//進入寫程序
m_writeCount=1;//禁止其他寫程序和其他讀程序進入
m_lock_writeCount.unlock();
m_lock_readCount.unlock();
}
//放開預寫判斷鎖
m_lock_preWriteCount.lock();//預寫程序減一
--m_preWriteCount;
//這裡可以考慮加入+1信号量2操作
m_lock_preWriteCount.unlock();
}
void ReadWriteLock::UnlockWrite(void)
{
m_lock_writeCount.lock();//寫程序置為0,放入預寫程序或讀程序
m_writeCount=0;
//這裡可以考慮加入+1信号量1操作
//這裡可以考慮加入+1信号量2操作
m_lock_writeCount.unlock();
}
加入信号量後,可以完美實作低CPU消耗的ReadWriteLock。