读者-写者模型

本文探讨了读者写者模型,其中读操作可并发进行,而写操作具有排他性。文章介绍了读写锁的概念,包括读写锁的创建、初始化、销毁以及读锁、写锁的加锁和解锁函数。此外,还简要提到了自旋锁,并给出了读者写者模型的简单实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.读者-写者模型

我们知道在一些程序中存在读者写者问题,就是对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,也就是具有排他性;另一种情况就是读操作,在读操作中可以有多个资源并发的去访问某种资源,它的访问方式是共享的。(一般由于写端操作次数少,读端操作次数多,因此写端的优先级较高)。这种模型是从对文件的读写操作中总结出的一种模型。

1.在读者和写者的这种模型中,存在3种关系,他们是:

1).读者和读者之间,读者与读者之间是可以并发的访问某种资源的,所以他们之间是没有关系的。

2).读者和写者之间,我们知道对一个文件来说是不可以既读又写的,可能会导致数据的二义性问题。读者和写着之间是互斥和同步的关系。

3).写着和写着之间,存在互斥的关系。

它与生产者与消费者模型最大的区别在于:
<1>.生产者与消费者模型里,只存在互斥与同步,而在读者与写着模型里出现了读者与读者之间的共享关系。
<2>.它俩之间最大的区别就是生产者与消费者模型是会将临界区里的数据取走,而读者与写者模型只是将数据只读不取。

2.在上面描述读者写者关系中提到了互斥和同步,那么为什么要保证互斥和同步的关系呢?

互斥:指某一种资源某一时刻只能允许一个访问者对它进行访问,具有唯一性和排他性。但是资源的互斥是无法保证访问者对资源的访问顺序的,即如果有多个访问者访问该资源时,访问是无顺序的。

同步:同步是在互斥的基础上(大多数是互斥+同步,有的情况下只需要同步),通过一些机制实现访问者对资源的有序访问。

理解了互斥和同步让我们继续来看读者和写者问题,我们知道读者在读的过程中存在查找操作,费时较长,如果给读者加锁会降低这种模型的实现效率,可以总结为读者写者模型就是一种多读少写的情况,为了解决这种情况,引入了读者锁的概念。

二.读写锁

读写锁是一种特殊的自旋锁,一个读写锁同时只能有一个写着或者是多个读者,但是不能同时即有读者又有写者,由上述读者和写者的关系可得。读写锁相对互斥锁来说,可以允许多个线程同时占用读模式的读写锁,具有更高的试用性和并行性。

关于读写锁的几个常见的函数:

1).创建读写锁,读写锁的类型是pthread_rwlock_t,创建的格式为
pthread_rwlock_t myrwlock。

2).创建之后就要初始化,读写锁的初始化函数为:

这里写图片描述

成功返回0,失败返回错误码。attr表示读写锁的属性,一般设置为NULL表示默认.

3).创建之后就需要销毁该读写锁,销毁函数为:

这里写图片描述

成功返回0,失败返回操作码,rwlock就是你定义的读写锁.

4).读者加锁函数

这里写图片描述

pthread_rwlock_rdlock和pthread_rwlock_tryrdlock的区别:

对读者进行加锁,pthread_rwlock_rdlock如果加锁失败则该线程就会被挂起等待;如果某些线程在加锁失败之后不想被挂起,则可以使用pthread_rwlock_trylock

6).写者加锁函数

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

成功返回0,失败返回错误码,两者的区别类似读者加锁函数

7).有加锁必然存在解锁函数,不管是读者解锁还是写着解锁都是pthread_rwlock_unlock函数。

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

成功返回0,失败返回错误码。

三.自旋锁

自旋锁的效率远远高于互斥锁,因为自旋锁不会引起访问者的休眠,减少了保持数据的开销,虽然自旋锁的效率比较高,但是它也存在一些问题:

1).降低CPU的使用效率。试想一下如果访问者一直未得到锁,那么它就会一直在CPU中等待该锁被释放,如果是单核操作系统这种弊端就会更加明显了。

2).可能会造成死锁。当递归调用或者调用一些函数时可能造成死锁,比如调用copy_to_user(),copy_from_user(),kmalloc()。

所以虽然自旋锁比较高效,但是要恰当使用,在多CPU或者是内核可抢占,SMP的情况下才需要自旋锁,自旋锁使用保持锁时间比较短的情况下.

四 读者与写者模型的简单实现

这里写图片描述

测试结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值