天天看點

個人作品:VC++版ReadWriteLock

#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。

繼續閱讀