读者写者模型

来源:互联网 发布: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是写者优先的。

原创粉丝点击