读写锁的实现原理(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则意味着有多个读进程占用该锁。

申请一个读锁时,

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

读写锁的实现原理(pthread_rwlock_t)

读写锁的实现原理(pthread_rwlock_t)

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

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

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

上一篇:Oracle SQL函数之数学函数


下一篇:神经网络训练中的Tricks之高效BP(反向传播算法)