11.3 Linux_线程_读写锁

时间:2024-10-04 19:12:49

概述

读写锁的作用:

读写锁是主要为了防止读文件与写文件冲突。如果A线程在读文件,此时B线程写入文件,破坏了原文件的内容,那么A线程读到的数据就是错误的,这就需要读写锁来禁止B线程写入文件。

读写锁特性:

写者使用写锁,只有当读者和写者都不存在时,才可获得锁,否则进入阻塞状态。

读者使用读锁,当写者不存在时,可以获得锁,否则进入阻塞状态。读锁允许多个读者获取

注意:当有读者使用读锁时,此时有写者想要获取写锁,这时写者被阻塞,同时其他读锁请求也会被阻塞。这防止了文件一直被读,无法被写入的情况。

多线程读文件注意点:

不论加不加读写锁,文件流指针都只有一个。线程1读了2行之后,线程2的读取是从第3行开始。因此在每个线程中需要考虑当前流指针的位置。

相关函数

1、初始化

//动态初始化
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
                        const pthread_rwlockattr_t *restrict attr);
//静态初始化
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

返回值:成功返回0,失败返回错误码

rwlock:要初始化的读写锁

attr:读写锁属性,NULL代表默认属性

2、销毁

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

返回值:成功返回0,失败返回错误码 

rwlock:要销毁的读写锁

3、上锁与解锁

//读锁,阻塞
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
//读锁,不阻塞
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
//写锁,阻塞
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
//写锁,不阻塞
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
//释放锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

rwlock:要进行操作 的读写锁