1、读写锁概念
对资源的访问抽象为两种类型,即独占和共享。独占资源具有排他性,例如写操作。共享资源可以同时由多个线程访问,不对该资源执行写操作。针对资源的读和写操作分别加锁,写操作加锁与互斥锁相同,但读操作加锁可以让多个线程同时访问。
优点:互斥锁进入临界区后,未获得锁的线程会阻塞,因此,会降低程序的并发效率。读写锁可以对读操作高效访问,提高资源利用效率,并发性能更高。
POSIX库中用类型pthread_rwlock_t来定义互斥锁,类型在pthreadtypes.h中定义。
2、如何声明一个读写锁
#include <pthread.h>pthread_rwlock_t rwlock;
3、如何初始化一个读写锁
//静态初始化读写锁
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;//动态初始化读写锁
pthread_rwlock_t rwlock;
pthread_rwlock_init(&rwlock,NULL);
静态初始化的读写锁不需要销毁,动态初始化的读写锁需要销毁,销毁函数声明如下:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
4、如何上锁和解锁
//读模式:上锁方式1,程序进入临界区,如果写模式已经上锁,则阻塞等待,如果读模式上锁,则获得锁进入临界区
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//读模式:上锁方式2,程序进入临界区,如果读写已经上锁,不阻塞,返回EBUSY
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);//写模式:上锁方式1,程序进入临界区,如果读写已经上锁,不阻塞,返回EBUSY
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//写模式:上锁方式2,程序进入临界区,如果读写已经上锁,不阻塞,返回EBUSY
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);//解锁,程序退出临界区
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);