【Linux】读者写者模型

原创 2018年04月15日 22:44:51

前面我们已经学过了生产者消费者模型,那本文就来介绍一个与它有些相似却又不同的读者写者模型。

什么是读者写者模型?

  一个数据文件或记录可以被多个进程共享,我们把只要求读文件的进程称为Reader进程,其他进程则被称为Write进程。允许多个进程同时读一个共享对象,但是不允许一个Write进程和其他Reader进程或Writer进程同时访问对象。因为这样可能会造成混乱。所谓“读者写者问题”只是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。
  
总结一下,也是”321“原则:
三种关系
(1)写者与写者:不能两个人同时写,所以互斥
(2)读者与读者:可以两个人同时读,所以没有关系,也可以说是共享的
(3)写者与读者:一个文件不能又是被读,又是被写的,所以互斥;写完了才能读,不读了才开始写,所以说又是同步的。
两种角色:读者和写者。
一个读写场所。

读者写者模型的“321”原则,虽然与生产者消费者很类似,但是却又不同。消费者是将数据带拿走,而读者则只是读数据,数据还在,并没有被拿走。这是两者之间最大的不同。

读写锁

  有时候经常会出现公共资源修改的机会比较少,读资源的机会比较多的情况,此时,就需要用到我们的读写锁了。读写锁是一种特殊的自旋锁,能提高并发性。它允许多个多个读者来访问资源;写者是排他性的,一个读写锁同时只能有一个写者或多个读者,但不能同时既有读者又有写者。
  如果读写锁当前没有读者,也没有写者,那么写者可以立刻获得读写锁,否则它必须自旋在那,直到没有任何写者或读者;反过来,如果读写锁没有写者,那么读者就可以立刻得到读写锁,否则,它要自旋知道写者释放读写锁。

自旋锁

  自旋锁与互斥锁比较类似,都是为了解决资源的互斥问题。对于互斥锁来说,如果资源已经被占用,申请者只能挂起等待,直到被唤醒。自旋锁则不会被挂起,它会一直循环着看锁是否被释放。
  自旋锁适用于占用临界资源时间较短的时候,因为自旋锁不会引起调用者睡眠,所以自旋锁的效率高于互斥锁。但是由于自旋锁一直占用CPU,所以如果不能在短时间内获得锁,谁使用CPU效率下降。

注意:写独占,读共享,写锁的优先级高

读写锁的接口

初始化:

 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, 
                const pthread_rwlockattr_t *restrict attr);

销毁:

 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

加锁:

 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//写锁
 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//读锁

解锁:

 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

下面我们写代码来使用一下读写锁,以加深印象。
这里使用线程来操作,创建三个写的线程,五个读的线程,这里写者优先级高。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
pthread_rwlock_t rwlock;
int count = 0;

void* route_write(void* arg)
{
    int i = (int)arg;
    int t = 0;
    while(1)
    {
        t = count;
        usleep(10000);
        pthread_rwlock_wrlock(&rwlock);
        printf("(write)no:(%d), id=%x, t=%d, count=%d\n", i, pthread_self(), t, ++count);
        pthread_rwlock_unlock(&rwlock);
        usleep(90000);
    }
}

void* route_read(void* arg)
{
    int i = (int)arg;
    while(1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("(read)no:(%d), id=%x, count=%d\n", i, pthread_self(), count);
        pthread_rwlock_unlock(&rwlock);
        usleep(10000);
    }
}
int main()
{
    pthread_t tid[8];
    pthread_rwlock_init(&rwlock, NULL);
    int i=0;
    for(; i<3; i++)
    {
        pthread_create(&tid[i], NULL, route_write, (void*)i);
    }

    for(i=3; i<8; i++)
    {
        pthread_create(tid+i, NULL, route_read, (void*)i);
    }

    for(i=0; i<8; i++)
    {
        pthread_join(tid[i], NULL);
    }

    pthread_rwlock_destroy(&rwlock);
    return 0;
}

运行结果:可以发现读者出现的比较多,写者出现的比较少。
这里写图片描述
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wei_cheng18/article/details/79954634

Linux---读者写者模型

一 怎么理解读者写者模型读者写者问题就是在一些程序中,对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,具有排他性;另一种情况就是读操作,在读操作中可以有多个操作并发的去访...
  • blight_888
  • blight_888
  • 2017-06-26 21:14:28
  • 277

例说读者写者模型

前面我们学习了生产者和消费者模型,想了解一下的可以去看看这篇客: http://blog.csdn.net/bit_clearoff/article/details/55805884什么是读者写者模...
  • bit_clearoff
  • bit_clearoff
  • 2017-02-20 16:22:08
  • 812

读者-写者模型

一.读者-写者模型我们知道在一些程序中存在读者写者问题,就是对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,也就是具有排他性;另一种情况就是读操作,在读操作中可以有多个资...
  • qq_35032155
  • qq_35032155
  • 2017-06-23 00:13:29
  • 300

读者写者模型与生产者消费者模型

读者写者模型 读者写者访问一块共享的数据区域,读者对共享资源进行读访问,写者对共享内存进行写操作。在多处理器系统中,运去多个读者同时访问共享内存,而写者是排他性的,每次只能有一个写者去写入数据。在使...
  • zw_1510
  • zw_1510
  • 2016-07-24 16:55:23
  • 1457

Java并发之读者写者模型

问题描述:设想一个飞机订票系统,其中有许多竞争的进程试图读写其中的数据。多个进程同时读取是可以接受的,但如果一个进程正在更新数据库,则所有的其他进程都不能访问数据库。即便是读操作也不行。Semapho...
  • c275046758
  • c275046758
  • 2016-01-24 21:01:30
  • 1223

linux C++ 多线程 读者写者实现

linux C++ 多线程 读者写者实现: /*readerAndWriter.cpp*/ #include #include #include #include int buf...
  • stone_flower_rain
  • stone_flower_rain
  • 2015-09-15 20:49:04
  • 902

生产者消费者模型和读者写者模型

消费者模型 生产者-消费者问题是一个经典的进程同步问题,生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置一个具有N个缓冲区的缓冲池,生产...
  • ranxiaoxu123
  • ranxiaoxu123
  • 2016-07-19 15:17:31
  • 1225

Linux多线程──读者写者问题

读者写者问题 这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。 程序: /...
  • iamzhaiwei
  • iamzhaiwei
  • 2012-07-12 21:37:56
  • 3829

Linux下的读者写者问题(写者优先)

  • 2009年12月14日 18:41
  • 4KB
  • 下载

linux读者写者问题

/* Copy right(c) 2014, Ants(Wuhan) * All rights reserved * * File name: reader_writer.cpp * The ...
  • lk547256398
  • lk547256398
  • 2014-04-24 09:02:08
  • 823
收藏助手
不良信息举报
您举报文章:【Linux】读者写者模型
举报原因:
原因补充:

(最多只允许输入30个字)