您的位置:首页 > 运维架构 > Linux

linux:读者写者模型

2017-07-09 01:15 162 查看
前面我们已经介绍过生产者消费者模型,其中提到了“321”原则。而本文中的读者写者模型同样遵循“321”原则。那么,什么是读者写者模型,它和我们介绍的生产者消费者模型又有什么不同呢?

读者写者模型:

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

读者写者模型的“321”原则:

三种关系:

(1)写者与写者之间:互斥关系

(2)读者与写者之间:既不同步也不互斥,他们之间事没有关系的

(3)读者与写者 :我们知道,对一个文件的操作不可以是既读又写的,可能睡导致二义性问题,因此读者和写者之间事同步与互斥关系。同步关系(读者优先或者写者优先),互斥关系(读者读完了写者才能写,写者写完了读者才能读,这样就保证了数据的有效性)。

二指的是:读者和写者两种身份

一指一个读写场所。

读者写者模型与生产者消费者模型的区别:

<1>.生产者与消费者模型里,只存在互斥与同步,而在读者与写着模型里出现了读者与读者之间的共享关系。

<2>.它俩之间最大的区别就是生产者与消费者模型是会将临界区里的数据取走,而读者与写者模型只是将数据只读不取。

读写锁

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

自旋锁

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:

1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。

2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

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

1,初始化和销毁读写锁



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

2,对读者加锁



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

3,对写者加锁



4,解锁



读者写者模型的具体代码:

(1)读者先读







运行结果:



(2)写者先写

只需对代码稍做修改即可





运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux