/**
* 利用LOCK汇编指令实现了多CPU情况下的,多线程同步问题,
**/
typedef struct ZRWLock
{
enum
{
MAX_WAIT_OBJECTS_COUNT = 0xff, // 写锁上最大等待数量
INIT_VAR_VALUE = -1, // 变量初始值
VAR_ENTER_VALUE = 0, // 获到锁时的值
};
bool bUseFlag; // 是否被使用
unsigned short usLockHandle; // 句柄
long lReadVar; // 读变量,
long lWriteVar; // 读变量
long lReaderCount; // 正在读的人数
long lWriterCount; // 写线程的重入数量
long nSpinCount; // 旋转锁
HANDLE hWriteSemaphore; // 写信号量
HANDLE hReadSemaphore; // 读信息号
DWORD dwWriteThreadId; // 写线程
ZRWLock* lpNext; // 空闲队列中用
} ZRWLOCK, *LPRWLOCK;
#define ZRWLOCK_READ_VAR(LPLOCK) DWORD PTR [LPLOCK+0x4]
#define ZRWLOCK_WRITE_VAR(LPLOCK) DWORD PTR [LPLOCK+0x8]
#define ZRWLOCK_READER_COUNT(LPLOCK) DWORD PTR [LPLOCK+0xc]
#define ZRWLOCK_WRITER_COUNT(LPLOCK) DWORD PTR [LPLOCK+0x10]
#define ZRWLOCK_SPIN_COUNT(LPLOCK) DWORD PTR [LPLOCK+0x14]
#define ZRWLOCK_WRITE_SEMAPHORE(LPLOCK) DWORD PTR [LPLOCK+0x18]
#define ZRWLOCK_READ_SEMAPHORE(LPLOCK) DWORD PTR [LPLOCK+0x1c]
#define ZRWLOCK_WRITE_THREADID(LPLOCK) DWORD PTR [LPLOCK+0x20]
typedef class ZLockFactory
{
protected:
/**
* 函数名称:构造函数
* 函数功能:主是防止用户自己创建此接口,不需要实现
* 参数列表:
* 修改记录: 20100203 赵海杰 创建
*/
ZLockFactory()
{}
/**
* 函数名称:拷贝构造函数
* 函数功能:主是防止用户自己创建此接口,不需要实现
* 参数列表:
* 修改记录: 20100203 赵海杰 创建
*/
ZLockFactory(ZLockFactory&);
/**
* 函数名称:柝构函数
* 函数功能:主是防止用户自己创建此接口
* 参数列表:
* 修改记录: 20100203 赵海杰 创建
*/
virtual ~ZLockFactory()
{}
public:
/**
* 函数名称:准备
* 函数功能:准备各种系统资源
* 参数列表:
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int Prepare() = 0;
/**
* 函数名称:释放
* 函数功能:释放所申请的各种系统资源
* 参数列表:
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int UnPrepare() = 0;
/**
* 函数名称:申请读写锁
* 函数功能:从空闲的读写锁结构中申请一个
* 参数列表:
* @usLockHandle : 返回的读写锁句柄号
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int GetRWLock(unsigned short& usLockHandle) = 0;
/**
* 函数名称:释放读写锁
* 函数功能:把读写锁置为空闲状态,以便于下次申请使用
* 参数列表:
* @usLockHandle : 读写锁句柄号
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int ReleaseRWLock(unsigned short usLockHandle) = 0;
/**
* 函数名称:进入读锁
* 函数功能:
* 参数列表:
* @usLockHandle : 读写锁句柄号
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int EnterReadLock(unsigned short usLockHandle) = 0;
/**
* 函数名称:离开读锁
* 函数功能:
* 参数列表:
* @usLockHandle : 读写锁句柄号
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int LeaveReadLock(unsigned short usLockHandle) = 0;
/**
* 函数名称:进入写锁
* 函数功能:
* 参数列表:
* @usLockHandle : 读写锁句柄号
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int EnterWriteLock(unsigned short usLockHandle) = 0;
/**
* 函数名称:离开写锁
* 函数功能:
* 参数列表:
* @usLockHandle : 读写锁句柄号
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
virtual int LeaveWriteLock(unsigned short usLockHandle) = 0;
} ZLOCKFACTORY, *LPLOCKFACTORY;
class ZLockFactoryInstance : public ZLockFactory
{
private:
/**
* 函数名称:构造函数
* 函数功能:主是防止用户自己创建此接口,不需要实现
* 参数列表:
* 修改记录: 20100203 赵海杰 创建
*/
ZLockFactoryInstance();
/**
* 函数名称:拷贝构造函数
* 函数功能:主是防止用户自己创建此接口,不需要实现
* 参数列表:
* 修改记录: 20100203 赵海杰 创建
*/
ZLockFactoryInstance(ZLockFactoryInstance&);
/**
* 函数名称:柝构函数
* 函数功能:主是防止用户自己创建此接口
* 参数列表:
* 修改记录: 20100203 赵海杰 创建
*/
virtual ~ZLockFactoryInstance();
/**
* 函数名称:进入读锁变量
* 函数功能:获取读锁变量的控制权,在进入读锁时使用,如果被别人获取了,则在此处进行等待
* 参数列表:
* @lplReadVer : 读变量
* @hReadSemaphore : 信号量
* @iMaxWaitCount : 最大等待数量
* @lSpinCount : 旋转数量
* @Result : 0——成功,<0——失败
* 修改记录: 20100203 赵海杰 创建
*/
// int EnterReadVar(volatile long* lplReadVer, HANDLE* lphReadSemaphore, const int iMaxWaitCount, long lSpinCount);
static int EnterReadVar(LPRWLOCK lpLock);
/**
* 函数名称:离开读锁变量
* 函数功能:释放读锁的控制权,
* 参数列表:
* @lplReadVer : 读变量
* @hReadSemaphore : 信号量
* &