读者写者模型
特点
(1)大部分操作是读取数据,少部分操作是写入数据
(2)读取数据的一端若仅仅是读取数据而不取走,则考虑读者写者模型,若会取走数据,则考虑生产者消费者模型
基本理论
(1)三种关系:
写者vs写者:互斥
读者vs写者:互斥(保证读到完整的数据)
读者vs读者:没有关系(可以多个人同时读)
(2)两种角色:
读者,写者
(3)一个交易场所:
一段缓冲区
相关函数
读写锁:rwlock
#include <pthread.h>
// 初始化
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);
// 销毁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
// 释放(两种身份通用)
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
读者:rdlock
// 以读者身份加锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
// 非阻塞式加锁
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
写者:wrlock
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
// 以写者身份加锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
伪代码:
int reader = 0;
//写者pthread_rwlock_wrlock()
mtx1.lock();
// 有读者,不能写
while(reader>0)
{
wait(); //释放锁
}
// 进入临界区
mtx1.unlock();
//读者pthread_rwlock_rdlock()
mtx1.lock(); //申请锁成功,说明没有人写,就可以读
reader++;
mtx1.unlock();
//;
// rwlock.unlock()
mtx1.lock();
reader--;
mtx1.unlock();
优先级
读者优先(默认)
读者、写者同时到来时,让读者先进入访问,存在写饥饿
写者优先
读者、写者同时到来时,让比当前写者晚来的读者不要进入临界区访问了,等临界区中没有读者时,让写者先写入