Pthread实现读写锁
1. 博客内容:
编写Pthread程序,使用两个条件变量和一个互斥量来实现一个读写锁。比较当读优先级更高时和写优先级更高时程序的性能。并进行归纳总结。
2. 实现思路:
2.1 读写锁:
读写锁是一种特殊的锁,它把对资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。
一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程占有读模式的读写锁。因此:
-
当读写锁是写加锁的状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞;
-
当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以获得锁,但是所有试图以写模式对这个锁加锁的线程都会被阻塞;
读优先和写优先:
-
读优先:给读者优先权,只要读写锁不是写加锁的状态,就可以进行读加锁,同时,当一个写线程解锁时,它应该优先唤醒所有的读加锁等待的线程;
-
写优先:给写者优先权,只有在当前状态不是写加锁并且没有写等待时,读加锁才能成功,否则就要等待,同时,当一个写线程解锁时,它应该优先唤醒一个写加锁等待的线程;
-
实现读写锁相关的数据结构:
-
两个条件变量:分别阻塞读线程和写线程;
-
两个读相关的变量,分别记录正在读取的线程数和正在等待读的线程数;
-
两个写相关的变量,分别记录是否有正在写的线程和正在等待写的线程数;
-
一个互斥量,互斥线程对于上述数据的访问和修改;
把这些变量打包成结构体就得到自己实现的读写锁的数据结构:
// self-definition read-write-lock
struct my_rwlock_t{
// use to lock itself
pthread_mutex_t mutex;
// read conditional lock
pthread_cond_t read;
// write conditional lock
pthread_cond_t write;
// record read and write threads
int read_now;
int read_wait;
int write_now;
int write_wait;
};
3. 相关函数:
3.1 读写锁初始化函数:
如图,初始化读写锁的条件变量,互斥锁和相关变量:
// initial read-write-lock
void my_rwlock_init(my_rwlock_t* rwlock){
pthread_mutex_init(&(rwlock->mutex), NULL);
pthread_cond_init(&(rwlock->read), NULL);
pthread_cond_init(&(rwlock->write), NULL);
rwlock->read_now = 0;
rwlock->read_wait = 0;
rwlock->write_now = 0;
rwlock->write_wait = 0;
};