Android Framework读写锁封装
Linux下线程同步对象——读写锁
读写锁又分为读锁定状态和写锁定状态,多个线程可以同时获得读锁定状态锁,但写锁定状态只能有一个线程获得,其他线程的读锁定请求和写锁定请求都将会阻塞直到当前的写锁定状态的释放。
首先介绍一下Linux下C语言中的读写锁所用到的一些函数。
(1)、创建读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);
说明:第一个参数为读写锁变量,第二个参数为对读写锁参数设置。初始化一个读写锁变量。
(2)、销毁读写锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
说明:销毁一个读写锁。
(3)、加读锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
说明:若当前读写锁为未加锁状态或者为读锁定状态,该函数都可以获得读写锁并返回;若该读写锁为写锁定状态,则该函数将阻塞调用线程,直到该读写锁的写锁定状态释放。
(4)、尝试加读锁
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
说明:若当前读写锁为未加锁状态或者为读锁定状态,该函数都可以获得读写锁并返回;若该读写锁为写锁定状态,则该函数将立即返回错误(错误码为EBUSY),不阻塞调用线程。
(5)、加写锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
说明:如果当前读写锁状态为未锁定,则该函数锁定该锁,并立即返回;如果该锁的状态为读锁定状态或者写锁定状态,则该函数将阻塞调用线程,直到该锁的读写状态被释放。
(6)、尝试加写锁
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
说明:如果当前读写锁状态为未锁定锁定,则该函数锁定该锁,并立即返回;如果该锁的状态为读锁定状态或者写锁定状态,则该函数立即返回,并返回错误码EBUSY,不阻塞调用线程。
(7)、解锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
说明:不管是读锁定状态和写锁定状态都调用这个函数解除锁定。
AndroidFramework层将读写锁封装成RWLock类,并且将上面的一些对读写锁操作的函数封装为该类的成员函数。
下面通过表格对比介绍一下AndroidFramework是如何封装上面这些函数的。
|
RWLock类成员变量和成员函数 |
说明 |
|
成员变量mRWLock |
pthread_rwlock_t类型 |
|
构造函数RWLock() |
调用pthread_rwlock_init() |
|
加读锁readLock() |
调用pthread_rwlock_rdlock() |
|
尝试加读锁tryReadLock() |
调用pthread_rwlock_tryrdlock() |
|
加写锁writeLock() |
调用pthread_rwlock_wrlock() |
|
尝试加写锁tryWriteLock() |
调用pthread_rwlock_trywrlock() |
|
解锁unlock() |
调用函数pthread_rwlock_unlock() |
|
析构函数~RWLock() |
调用pthread_rwlock_destroy() |
本文详细介绍了AndroidFramework中读写锁的封装实现,包括读写锁的创建、销毁、加锁、尝试加锁及解锁操作,以及如何在代码中正确使用这些API。
1167

被折叠的 条评论
为什么被折叠?



