UNIX网络编程卷二 笔记 读写锁和记录上锁

来源:互联网 发布:软件测试培训ppt 编辑:程序博客网 时间:2024/05/20 03:43

                                             第4章  读写锁和记录上锁

4.1 读写锁

读写锁用于读取数据比修改数据更频繁的场景,它的分配规则如下:

1.  没有线程持有写锁时,任意多的线程可以持有读锁。

2.  仅当没有线程持有读锁或写锁时,才能分配写锁。

当已有线程持有读锁时,另一线程申请写锁则会阻塞,若后续还有读锁的申请,此时有两种策略:

1.  对后续的读锁请求都通过,可能会造成因读锁不断被分配,写锁申请始终阻塞,“饿死”了写进程。

3.  后续读锁请求都阻塞,等当前持有的读锁都结束后优先分配写锁。

4.2 功能函数

读写锁的静态分配可用PTHREAD_RWLOCK_INITIALIZER,动态分配用pthread_rwlock_init初始化,它的属性也是PTHREAD_PROCESS_PRIVATEPTHREAD_PROCESS_SHARED,也需要对应类型的属性对象。读写锁的initdestroy要结对使用,pthread_rwlockattr_t属性对象也同样。

pthread_rwlock_rdlock:阻塞模式申请读锁。

pthread_rwlock_wrlock:阻塞模式申请写锁。

pthread_rwlock_tryrdlock:非阻塞模式申请读锁。

pthread_rwlock_tryrdlock:非阻塞模式申请读锁。

pthread_rwlock_unlock:解锁。

4.3 记录上锁

记录上锁是读写锁的一种扩展类型,它可用于任意两个进程间共享某文件的读和写。执行上锁的函数是fcntl,锁由内核维护,其属主由进程ID标识。

Unix内核没有记录这一概念,对记录的解释是由读写文件的应用进行的。每个记录就是文件中的一个字节范围。

Posix记录上锁的粒度是单个字节,粒度越小,允许同时使用的用户数就越多。

4.4 fcntl

int fcntl(int fd, int cmd, .../* struct flock *arg*/);

fcntl函数的cmd参数为以下三个值时,执行记录上锁的相关操作:

1.  F_SETLK获取或释放指定的锁,若无法完成该操作则返回出错而不阻塞。

2.  F_SETLKW阻塞版本的F_SETLK

3.  F_GETLK检查arg指向的锁是否与某个已存在的锁冲突。

F_GETLK后紧接着F_SETLK不是原子操作。

fcntl不能对只读打开的文件获取写锁,也不能对只写打开的文件获取读锁。

锁住整个文件的两个方式:

1.  l_whence成员为SEEK_SET,l_start的成员为0l_len成员为0

2.  lseek把读写指针放到文件头,然后令l_whenceSEEK_SET,l_start0l_len0

某个文件描述符被关闭时,与它关联的记录锁都被删除。记录锁不能通过fork子进程继承。

记录锁不应该同标准I/O函数一起使用,因为标准I/O库使用了缓冲。

NFS可以使用记录锁。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 10个月幼儿便秘怎么办 太阳晒了长斑怎么办 膀胱癌复发5回了怎么办 右肾囊肿有1cm,怎么办, 牙侧面有小小洞怎么办 喝酒喝的手抖怎么办 孩子在幼儿园不爱说话怎么办 孕妇吃了方头鱼怎么办 油炸的东西软了怎么办 跑步小腿疼怎么办 知乎 健身后小腿粗了怎么办 背心式内衣大了怎么办 运动文胸买大了怎么办 喝碳酸饮料胖了怎么办 奥鹏学费迟交了怎么办 侧乌鸦做不起来怎么办 发烧很难受怎么办 知乎 上班后奶水越来越少怎么办 孕晚期胖的厉害怎么办 怀孕后猛长胖怎么办啊 怀孕坐了按摩椅怎么办 怀孕8个月胎位不正怎么办 缓刑期间被打了怎么办 非法集资人跑了怎么办 玩游戏恶心想吐怎么办 中奖了填了信息怎么办 穿开衫老是溜肩怎么办 开车开久了腰疼怎么办 西药吃了胃难受怎么办 铁海棠叶子变黄怎么办 四季海棠根烂了怎么办 水银弄到皮肤上怎么办 头条指数下降了怎么办 下面长泡泡破了怎么办 期望工资说低了怎么办 机票买了后降价怎么办 刚谈对象没话说怎么办 微信好友太少怎么办 qq头像不显示了怎么办 找借口不出去玩怎么办 老婆不花我的钱怎么办