Linux入门篇——多线程之读者写者模型

读者写者模型

特点

(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();

优先级

读者优先(默认)

读者、写者同时到来时,让读者先进入访问,存在写饥饿

写者优先

读者、写者同时到来时,让比当前写者晚来的读者不要进入临界区访问了,等临界区中没有读者时,让写者先写入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值