【2】自己写数据库函数库 — 记录锁

”记录锁“更准确的叫法应该是”字节范围锁“,它可以锁住文件的部分字节,使不同进程间互斥地访问文件的这部分字节。同时,锁的属性是可以设置的,锁的类型分为以下三种:

  • 共享读锁
  • 独占写锁
  • 解锁
当锁类型为共享读时,运行多个进程同时访问,因为是读,所以是安全的。当锁类型为独占写锁时,必须互斥地访问,因为此时进行的是写操作。

接下来看看记录锁在本数据库函数库中的应用,代码如下:
/* 记录所相关函数 */
int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
	struct flock lock;		/* 定义一个记录所 */

	lock.l_type = type;		/* 锁类型(F_RDLCK, F_WRLCK, F_UNLCK) */
	lock.l_start = offset;	/* 从whence处的偏移量 */
	lock.l_whence = whence;	/* 起始点 */
	lock.l_len = len;		/* 加锁区域长度 */

	/* cmd:
	 *		F_GETLK:测试能够建立一把锁
	 *		F_SETLK:试图建立一把锁,不会阻塞
	 *		F_SETLKW:试图建立一把锁,会阻塞
	 */
	return (fcntl(fd, cmd, &lock));
}

/* 非阻塞型读锁 */
#define read_lock(fd, offset, whence, len) \
					lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))

/* 阻塞型读锁 */
#define readw_lock(fd, offset, whence, len) \
					lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))

/* 非阻塞型写锁 */
#define write_lock(fd, offset, whence, len) \
					lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))

/* 阻塞型写锁 */
#define writew_lock(fd, offset, whence, len) \
					lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))

/* 解锁 */
#define un_lock(fd, offset, whence, len) \
					lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))

lock_reg函数根据参数设置不同的锁,然后调用系统调用fcntl使锁生效。实际上记录锁就是一个struct flock结构体,对它的设置在代码的注释中已经说明了,这里不再详述。为了方便函数库内部调用,这里把需要的不同类型的锁做成了宏的形式,需要什么样的锁就调用对应的宏。

更多关于记录锁在内容,参考《unix环境高级编程》14.3节。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值