读者写者模型
来源:互联网 发布:java 2017腾讯面试题 编辑:程序博客网 时间:2024/06/07 15:26
一、问题描述
有一个多个进程共享的数据区,这个区域可以是一个文件或者一块内存空间,甚至可以是一组寄存器。有一些进程(reader)只读取这个数据去的数据,一些进程(writer)只往数据区写数据;除外还必须满足以下条件:
1) 任意多个进程可以同时读这个文件(共享关系)
2)一次只有一个写进程可以写文件(互斥关系)
3)如果一个进程正在写文件,禁止任何读进程读文件(互斥关系)
也就是说,读进程是不需要排斥其他进程的,而写进程是需要排斥其他进程的。
二、 三种关系
将读写模型问题分角色展开,之间关系可总结为:
1.读者与读者 共享关系
同一时刻允许有多个读者进程访问数据
2.写者与写者 互斥关系
一次只有一个写进程可以写文件
3.读者与写者 同步 互斥
同步:只有先进行写入,读取的数据才有意义(因此写入后才可以进行读取)
互斥:写的时候不能进行读取,读取的时候不能进行写入
三、读写锁的引入
读写锁本质:是一种自旋锁(由操作系统维护,不断询问当前状态是否处就绪状态)
自旋锁适用场景:锁短时间会再次使用,(也就是等待的时间比较短的场合)
读写模型中,相较于写者,读的机会反而高的多,对于一般的锁,耗费时间就会比较长,使用读写锁比较合适。
四、读-写模型 与 生产者-消费者模型之间的区别
之间关系本质有二:
①读写模型并不会把数据取走
在生产者与消费者模型中:如果一个消费者把一个资源购买或使用,其他消费者就看不到这份资源。
②在读写模型中,读者与读者是资源共享关系,
而生产者消费者模型中,消费者与消费者是互斥关系。
五、代码实现模型
/************************************************************************* > File Name: rmlock.c > Author: steve_abelieve > Mail: caoliang2025@foxmail.com > Created Time: Sat 24 Jun 2017 04:43:01 AM PDT ************************************************************************/#include<stdio.h>#include<pthread.h>#include<unistd.h>#define WRITER_NUM 2#define READER_NUM 3int book=0;pthread_rwlock_t rwlock;void* myread(void* arg){ pthread_detach(pthread_self()); while(1) { if(pthread_rwlock_tryrdlock(&rwlock)!=0) { printf("writer is writing , reder waiting...\n"); } else { printf("reader is %u : read val is%d\n",pthread_self(),book); //sleep(5); pthread_rwlock_unlock(&rwlock); }// sleep(5); } return NULL;}void* mywrite(void* arg){ pthread_detach(pthread_self()); while(1) { if(pthread_rwlock_trywrlock(&rwlock)!=0) { printf("reader is reading ...!\n"); sleep(1); } else { book++; printf("writer is %u : write val is :% d\n",pthread_self(),book); //sleep(5); pthread_rwlock_unlock(&rwlock); } // sleep(1); } return NULL;}int main(){ pthread_t id; int i; for(i=0;i<WRITER_NUM;i++) { pthread_create(&id,NULL,mywrite,NULL); } for(i=0;i<READER_NUM;i++) { pthread_create(&id,NULL,myread,NULL); } //pthread_join(id,NULL); sleep(100); return 0;}
六、补充: rwlock是读者优先?还是写者优先?
相对于写者而言,读写自旋锁读读者更为有利一些。如果自旋锁被读者拥有,只要至少一个读者拥有该资源,那么写者就不能抢占资源。而且即使已经有写者等待资源,新来的读者仍然会抢险获得该资源。
据此分析,rwlock是写者优先的。
- 读者写者模型
- 读者写者模型
- 读者-写者模型
- 读者写者模型
- 读者写者模型
- 读者写者模型
- 读者_写者模型
- 浅析读者写者模型
- Linux---读者写者模型
- linux:读者写者模型
- Java并发之读者写者模型
- 例说读者写者模型
- 生产者消费者模型和读者写者模型
- 读者写者模型与生产者消费者模型
- 读者写者问题
- 读者写者问题
- 读者-写者问题
- 读者-写者优先
- 深入理解Java虚拟机(二)垃圾收集器与内存分配策略
- 使用Android Studio导入源码
- hadoop生态圈详解
- 如何搭建一个 Redis 集群
- MySQL中KEY与INDEX的区别
- 读者写者模型
- 字符数组与字符常量
- Web Server & Web Technology(计算机网络技术)
- 根据国家 ID 和运输方式正则限制字样
- BRVAH官方使用指南
- 在Windows下搭建Gitlab服务器
- 深入理解Java虚拟机(三)性能监控、优化
- leetcode 87. Scramble String 二分法
- 使用Zend Studio或myeclipse做PHP开发的速度优化方法