一个简单的读写锁的实现(WINDOWS平台)

来源:互联网 发布:视频后期制作软件 编辑:程序博客网 时间:2024/06/04 18:56

#include<windows.h>
class CReadWriteLock
{
private:
    LONGmdwReaders;
   CRITICAL_SECTION mEnterLock;
public:
   CReadWriteLock(void);
   ~CReadWriteLock(void);
    boolReadLock();
    boolReadUnlock();
    boolWriteLock();
    boolWriteUnlock();
};

/***************************************************
CReadWriteLock::CReadWriteLock(void)
构造函数
*****************************************************/
inline CReadWriteLock::CReadWriteLock(void)
{
   InitializeCriticalSection(&mEnterLock);
    mdwReaders =0;
    #ifdef_FAN_DEBUG__
       std::cout<<"Create ReadWriteLock"<<endl;
    #endif//_FAN_DEBUG__
}
/***************************************************
CReadWriteLock::~CReadWriteLock(void)
析构函数
*****************************************************/
inline CReadWriteLock::~CReadWriteLock(void)
{
   DeleteCriticalSection(&mEnterLock);
    #ifdef_FAN_DEBUG__
       std::cout<<"Delete ReadWriteLock"<<endl;
    #endif//_FAN_DEBUG__
}
/***************************************************
CReadWriteLock::ReadLock()
读加锁
返回植:true       锁定成功
       false      其它情况
*****************************************************/
inline bool CReadWriteLock::ReadLock()
{
   EnterCriticalSection(&mEnterLock);
   InterlockedIncrement(&mdwReaders);
   LeaveCriticalSection(&mEnterLock);
    #ifdef_FAN_DEBUG__
       std::cout<<"Reader lock success."<<endl;
    #endif//_FAN_DEBUG__
    returntrue;
}
/***************************************************
CReadWriteLock::ReadUnlock()
读开锁
返回植:true       锁定成功
       false      其它情况
*****************************************************/
inline bool CReadWriteLock::ReadUnlock()
{
   InterlockedDecrement(&mdwReaders);
    #ifdef_FAN_DEBUG__
       std::cout<<"Reader unlock success."<<endl;
    #endif//_FAN_DEBUG__
    returntrue;
}
/***************************************************
CReadWriteLock::WriteLock()
写加锁
返回植:true       锁定成功
       false      其它情况
*****************************************************/
inline bool CReadWriteLock::WriteLock()
{
    //HANDLEmhThread = GetCurrentThread();
    //BOOLmbSetPrioritySuccess = FALSE;
   EnterCriticalSection(&mEnterLock);
   //直到读的用户全部退出
    //if(mdwReaders>0)
   //{
   //       mbSetPrioritySuccess =
   //       SetThreadPriority(mhThread,THREAD_PRIORITY_LOWEST);
   //}
   while(mdwReaders>0)
    {
    #ifdef_FAN_DEBUG__
       std::cout<<"Writer lock test Readernumber."<<endl;
       std::cout<<"Current Reader number is"<<mdwReaders<<endl;
    #endif//_FAN_DEBUG__
       Sleep(0);
    }
    //if(mbSetPrioritySuccess)
   //{
   // SetThreadPriority(mhThread,THREAD_PRIORITY_NORMAL);
   //}
    #ifdef_FAN_DEBUG__
       std::cout<<"Writer lock success."<<endl;
    #endif//_FAN_DEBUG__
    returntrue;
}

/***************************************************
CReadWriteLock::WriteUnlock()
写解锁
返回植:true       锁定成功
       false      其它情况
*****************************************************/
inline bool CReadWriteLock::WriteUnlock()
{
   LeaveCriticalSection(&mEnterLock);
    #ifdef_FAN_DEBUG__
       std::cout<<"Writer unlock success."<<endl;
    #endif//_FAN_DEBUG__
    returntrue;
}

原创粉丝点击