自已写的Row Locking的实现,请大家指点一下是否有有关问题
自已写的Row Locking的实现,请大家指点一下是否有问题
发贴问CSND的朋友,Row Locking的实现,没有人回答,就自已根据自已的需要写了一个,请大家给点建立,如,死锁如何处理等(大学学习时有个什么银行家算法,不知到那有原代码)
代码很简单,如下
#include "StdAfx.h "
#include ".\rowlocker.h "
//==================================================ROWLOCK=======================================================
BOOL RowLock::acquireShared(WORD &Ref,BYTE &Flage)
{
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_EXPLICIT)== 0 && (Flage & DB_LOCK_UPDATE) == 0)
{//没有EXPLICIT锁和UPDATE锁
Flage |= DB_LOCK_SHARED;
Ref ++ ;
return TRUE;
}
}
::SwitchToThread();
}
}
BOOL RowLock::releaseShared(WORD &Ref,BYTE &Flage)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
ACE_ASSERT(Ref != 0);
Ref -- ;
if(Ref == 0)
Flage &= ~DB_LOCK_SHARED;
}
return TRUE;
}
BOOL RowLock::acquireExplicit(WORD &Ref,BYTE &Flage)
{
//获取DB_LOCK_UPDATE锁
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_EXPLICIT)== 0 && (Flage & DB_LOCK_UPDATE) == 0)
{
Flage |= DB_LOCK_UPDATE;
break;
}
}
::SwitchToThread();
}
//转变DB_LOCK_UPDATE锁到DB_LOCK_EXPLICIT锁
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_SHARED) == 0)
{
Flage &=~DB_LOCK_UPDATE;
Flage |= DB_LOCK_EXPLICIT;
break;
}
}
::SwitchToThread();
}
return TRUE;
}
BOOL RowLock::releaseExplicit(WORD &Ref,BYTE &Flage)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
ACE_ASSERT(Ref == 0);
Flage &= ~DB_LOCK_EXPLICIT;
}
return TRUE;
}
BOOL RowLock::ExplicitToShared(WORD &Ref,BYTE &Flage)
{
ACE_ASSERT((Flage & DB_LOCK_EXPLICIT) != 0 && Ref == 0);
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
Flage &= ~DB_LOCK_EXPLICIT;
Ref++;
Flage |= DB_LOCK_SHARED;
}
return TRUE;
}
BOOL RowLock::SharedToExplicit(WORD &Ref,BYTE &Flage)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
ACE_ASSERT(Ref != 0 && (Flage & DB_LOCK_EXPLICIT)== 0 && (Flage & DB_LOCK_UPDATE) == 0);
Ref -- ;
if(Ref == 0)
Flage &= ~DB_LOCK_SHARED;
Flage |= DB_LOCK_UPDATE;
}
//转变DB_LOCK_UPDATE锁到DB_LOCK_EXPLICIT锁
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_SHARED) == 0)
{
发贴问CSND的朋友,Row Locking的实现,没有人回答,就自已根据自已的需要写了一个,请大家给点建立,如,死锁如何处理等(大学学习时有个什么银行家算法,不知到那有原代码)
代码很简单,如下
#include "StdAfx.h "
#include ".\rowlocker.h "
//==================================================ROWLOCK=======================================================
BOOL RowLock::acquireShared(WORD &Ref,BYTE &Flage)
{
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_EXPLICIT)== 0 && (Flage & DB_LOCK_UPDATE) == 0)
{//没有EXPLICIT锁和UPDATE锁
Flage |= DB_LOCK_SHARED;
Ref ++ ;
return TRUE;
}
}
::SwitchToThread();
}
}
BOOL RowLock::releaseShared(WORD &Ref,BYTE &Flage)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
ACE_ASSERT(Ref != 0);
Ref -- ;
if(Ref == 0)
Flage &= ~DB_LOCK_SHARED;
}
return TRUE;
}
BOOL RowLock::acquireExplicit(WORD &Ref,BYTE &Flage)
{
//获取DB_LOCK_UPDATE锁
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_EXPLICIT)== 0 && (Flage & DB_LOCK_UPDATE) == 0)
{
Flage |= DB_LOCK_UPDATE;
break;
}
}
::SwitchToThread();
}
//转变DB_LOCK_UPDATE锁到DB_LOCK_EXPLICIT锁
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_SHARED) == 0)
{
Flage &=~DB_LOCK_UPDATE;
Flage |= DB_LOCK_EXPLICIT;
break;
}
}
::SwitchToThread();
}
return TRUE;
}
BOOL RowLock::releaseExplicit(WORD &Ref,BYTE &Flage)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
ACE_ASSERT(Ref == 0);
Flage &= ~DB_LOCK_EXPLICIT;
}
return TRUE;
}
BOOL RowLock::ExplicitToShared(WORD &Ref,BYTE &Flage)
{
ACE_ASSERT((Flage & DB_LOCK_EXPLICIT) != 0 && Ref == 0);
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
Flage &= ~DB_LOCK_EXPLICIT;
Ref++;
Flage |= DB_LOCK_SHARED;
}
return TRUE;
}
BOOL RowLock::SharedToExplicit(WORD &Ref,BYTE &Flage)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
ACE_ASSERT(Ref != 0 && (Flage & DB_LOCK_EXPLICIT)== 0 && (Flage & DB_LOCK_UPDATE) == 0);
Ref -- ;
if(Ref == 0)
Flage &= ~DB_LOCK_SHARED;
Flage |= DB_LOCK_UPDATE;
}
//转变DB_LOCK_UPDATE锁到DB_LOCK_EXPLICIT锁
while(true)
{
{
ACE_Guard <ACE_Recursive_Thread_Mutex> locker(m_cs);
if((Flage & DB_LOCK_SHARED) == 0)
{