我是靠谱客的博主 留胡子外套,最近开发中收集的这篇文章主要介绍读写锁的实现原理(pthread_rwlock_t)引言读写锁实现原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

引言

不同的锁之间的语义是不一样的,没有一劳永逸的锁,只有更适合的锁。

如果是同一进程里的不同线程共享读写锁,那么读写锁变量的维护是在进程内部即可。如果是不同进程共享读写锁,那么读写锁变量的维护是在共享存储区。

读写锁的分配规则:

(1)只要没有线程占用写锁,那么任意数目的线程都可以持有这个读锁。

(2)只要没有线程占用读写锁,那么才能为一个线程分配写锁。

读锁相当于一个共享锁,写锁i相当于独占锁。

和当初上操作系统讲的读者写者问题一样,只是当初好不理解啊。

读写锁实现原理

 一种实现机制——互斥锁和条件变量。读者有兴趣可以自己实现一种。这种实现是一种写优先。

1、pthread_rwlock_t数据结构

typedef struct{
pthread_mutex_t rw_mutex;// basic lock on this
struct
pthread_cond_t
rw_condreaders;//for reader
pthread_cond_t rw_condwriteres;//for writer
int rw_magic;
//for error checking
int rw_nwaiterreaders;
//the num of readers
int rw_nwaiterwirteres;
//the num of writers
int rw_refcount;
//-1 is writer has this lock else reader has this lock
}pthread_rwlock_t;

 rw_magic这个成员,如果没有设置属性的时候,创建锁的时候就会给予一个默认值(用于检查传递的锁是否是一个已经完成初始化的锁)。摧毁锁的时候,设置为0.

rw_refcount这个成员,它是用来指示本读写锁的当前状态,-1表示写锁,0表示可用,>0则意味着有多个读进程占用该锁。

申请一个读锁时,

锁的释放,假定优先唤醒写操作:

 

2、同一进程里面的不同线程,是可以相互取消的。相互取消这种情况还是会发生的,比如一个线程发现了一些错误,这些错误是致命的,所以要通知其他线程,你们别干了,再干下去还是会遇到错误,所以就把他们取消了。拿本设计结构来说,如果被取消的线程是获取了互斥锁,并且阻塞在pthread_cond_wait调用中,这个时候应该怎们办呢?因为,线程被动终止(可能没有解互斥锁的调用),而不是主动中止(有解互斥锁的调用),用到清理程序。清理程序会在线程终止时被调用,无需主动显式调用。

pthread_cleanup_push(void (*func(void *)),void *arg);

pthread_cleanup_pop(int excute);显式取消所注册的清理程序

转载于:https://www.cnblogs.com/sylz/p/6030675.html

最后

以上就是留胡子外套为你收集整理的读写锁的实现原理(pthread_rwlock_t)引言读写锁实现原理的全部内容,希望文章能够帮你解决读写锁的实现原理(pthread_rwlock_t)引言读写锁实现原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部