读写锁管理器的实现

/**

 * 利用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 : 信号量
 *   &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值