一 怎么理解读者写者模型
读者写者问题就是在一些程序中,对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,具有排他性;另一种情况就是读操作,在读操作中可以有多个操作并发的去访问某种资源,它的访问方式是共享的。这种从对文件的读写操作中总结出的的这种模型叫做读写者模型。
1.读者写者模型的三种关系
(1)读者和读者——没有关系;
(2)读者和写者——同步和互斥;
(3)写者和写者——互斥。
2.同步和互斥
同步:同步是在互斥的基础上通过一些机制实现访问者对资源的访问是有序的。
互斥:某一种资源同时只能允许一个访问者对他进行访问,具有唯一性和排他性,但是仅仅保持互斥关系是没法保证对某种公共资源的有序访问的,所以需要互斥和同步配合使用。
二 什么是读写锁
读写锁实际上是一种特殊的自旋锁,他把对资源的访问分为读者和写者,读者只进行对资源的访问,写者则需要对共享资源进行写操作。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与cpu数相关),但是不能既有读者又有写者,
读写锁状态
1.读加锁状态:当处于读加锁状态时,所有试图以读模式对这个锁进行访问的线程都可以获得访问权,但是任何以写模式对此锁进行访问的线程都会被阻塞,直到所有的线程都释放他们的读状态锁为止。
2.写加锁状态:当处于写加锁状态时,在被解锁之前,所有试图对锁进行的访问都会被阻塞;
三 关于读写锁的函数
1)创建读写锁
pthread_rwlock_t myrwlock
2)初始化读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
成功返回0,失败返回错误码。attr表示读写锁的属性,一般设置为NULL表示默认.
3)销毁读写锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
成功返回0,失败返回操作码,rwlock就是你定义的读写锁.
4)读者加锁函数
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);