ThreadModel.h
#ifndef __THREAD_MODEL__
#define __THREAD_MODEL__
//////////////////////////////////////////////////////////////////////
//多线程锁类(根据模拟ATL多线程锁类) //
//by 小银(jones) 20060723 //
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//CJSCriticalSection 手动锁, //
//通过Init(),Term()来建立和删除 //
//////////////////////////////////////////////////////////////////////
class CJSCriticalSection
{
public:
void Lock();
void Unlock();
void Init();
void Term();
private:
CRITICAL_SECTION m_sec;
};
//////////////////////////////////////////////////////////////////////
//CJSAutoCriticalSection 自动锁,通过构造和析构来建立和删除 //
// //
//////////////////////////////////////////////////////////////////////
class CJSAutoCriticalSection
{
public:
CJSAutoCriticalSection();
~CJSAutoCriticalSection();
void Lock();
void Unlock();
private:
CRITICAL_SECTION m_sec;
};
//////////////////////////////////////////////////////////////////////
//CJSFakeCriticalSection 伪锁 空函数 //
// //
//////////////////////////////////////////////////////////////////////
class CJSFakeCriticalSection
{
public:
void Lock();
void Unlock();
void Init();
void Tream();
};
//////////////////////////////////////////////////////////////////////
//CJSSingleThreadModel 单线程 //
// //
//////////////////////////////////////////////////////////////////////
class CJSSingleThreadModel
{
public:
//对引用记数的操作
static LONG Increment(LPLONG p);
static LONG Decrement(LPLONG p);
typedef CJSFakeCriticalSection AutoCriticalSection;
typedef CJSFakeCriticalSection CirticalSection;
};
//////////////////////////////////////////////////////////////////////
//CJSMultiTheadModel 多线程 //
// //
//////////////////////////////////////////////////////////////////////
class CJSMultiTheadModel
{
public:
//对引用记数的操作
static LONG Increment(LPLONG p);
static LONG Decrement(LPLONG p);
typedef CJSAutoCriticalSection AutoCriticalSection;
typedef CJSCriticalSection CirticalSection;
};
template<class ThreadModel> class CJSObjectLockT;
//////////////////////////////////////////////////////////////////////
//CJSObjectRoot 支持多线程和单线程的基类 //
// //
//////////////////////////////////////////////////////////////////////
template<typename ThreadModel>
class CJSObjectRoot
{
public:
typedef ThreadModel _ThreadModel;
typedef _ThreadModel::AutoCriticalSection _CritSec;
typedef CJSObjectLockT<_ThreadModel> ObjectLock;
void Lock() { m_CritSec.Lock(); }
void Unlock() { m_CritSec.Unlock(); }
private:
_CritSec m_CritSec;
};
//////////////////////////////////////////////////////////////////////
//CJSObjectLockT 自动解锁功能
//
//////////////////////////////////////////////////////////////////////
template<class ThreadModel>
class CJSObjectLockT
{
public:
CJSObjectLockT(CJSObjectRoot<ThreadModel>* p)
:m_p(NULL)
{
if (p) p->Lock();
m_p=p;
}
~CJSObjectLockT()
{
if (m_p) m_p->Unlock();
}
private:
CJSObjectRoot<ThreadModel>* m_p;
};
#endif
//实现 ThreadModel.cpp
void CJSCriticalSection::Lock()
{
EnterCriticalSection(&m_sec);
}
void CJSCriticalSection::Unlock()
{
LeaveCriticalSection(&m_sec);
}
void CJSCriticalSection::Init()
{
InitializeCriticalSection(&m_sec);
}
void CJSCriticalSection::Term()
{
DeleteCriticalSection(&m_sec);
}
CJSAutoCriticalSection::CJSAutoCriticalSection()
{
InitializeCriticalSection(&m_sec);
}
CJSAutoCriticalSection::~CJSAutoCriticalSection()
{
DeleteCriticalSection(&m_sec);
}
void CJSAutoCriticalSection::Lock()
{
EnterCriticalSection(&m_sec);
}
void CJSAutoCriticalSection::Unlock()
{
LeaveCriticalSection(&m_sec);
}
void CJSFakeCriticalSection::Lock() {}
void CJSFakeCriticalSection::Unlock() {};
void CJSFakeCriticalSection::Tream() {};
void CJSFakeCriticalSection::Init() {};
LONG CJSSingleThreadModel::Increment(LPLONG p)
{
return ++(*p);
}
LONG CJSSingleThreadModel::Decrement(LPLONG p)
{
return --(*p);
}
LONG CJSMultiTheadModel::Increment(LPLONG p)
{
return InterlockedIncrement(p);
}
LONG CJSMultiTheadModel::Decrement(LPLONG p)
{
return InterlockedDecrement(p);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//用例
class CTest : public CJSObjectRoot<CJSMultiTheadModel>
{
public:
void TestObjectLockT()
{
ObjectLock(this);
}
};
int main(int argc, char* argv[])
{
CTest test;
test.TestObjectLockT();
return 0;
}