读并行,写串行的锁。
#include <pthread.h>
pthread_rwlock_t lock;
- 初始化读写锁
#include <pthread.h>
int pthread_rwlock_init(
pthread_rwlock_t *restrict rwlock, // 锁的地址
const pthread_rwlockattr_t *restrict attr // 常为NULL
);
- 销毁读写锁
#include <pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
- 加读锁或尝试加读锁
#include <pthread.h>
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); // 若之前这把锁已经有加写锁操作,阻塞住
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); // 加锁成功返回0,失败返回错误
- 加写锁或尝试加写锁
#include <pthread.h>
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); // 上一次加写锁,还未解锁时会阻塞。上一次加读锁,读锁未解锁时也会阻塞。
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); //
- 解锁
#include <pthread.h>
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
- 读写锁的类型
- 读锁: 对内存做读操作
- 写锁: 对内存做写操作
- 读写锁的特性
- 线程a加读锁成功,又来了3个线程做读操作。可以成功加读锁。 读共享数据可以并行处理
- 线程a加写锁成功,又来了3个线程做读操作。此时三个线程阻塞。 写锁独占
- 线程a加读锁成功,又来了线程b加写锁阻塞。又来c线程加读锁也阻塞。
- 读写不能同时。
- 写优先级高。(如果a读锁释放了,b先获得写锁,哪怕bc同时申请)
程序中的读操作多于写操作时用到读写锁。